Заменить столбец и сохранить интервал

С zsh:

autoload zfinit
zfinit
zmodload zsh/datetime

files=N*.TXT
zfopen $host $user $passwd &&
  zfcd $remotedir &&
  zfrglob files &&
  for f ($files) {
    t=$EPOCHREALTIME
    strftime -s ts %H%M%S ${t%.*}
    ts=$ts.${t#*.}
    zfgcp -Gt $f N_$ts.TXT
  }
zfclose
3
13.04.2017, 15:36
3 ответа

Используйте регулярное выражение ( [^ [: blank:]] т.е. непустое) и замените 11 -ое совпадение:

awk '{print gensub (/[^[:blank:]]+/, v, 11)}' v="$value" infile

То же with sed :

sed "s/[^[:blank:]]\{1,\}/${value}/11" infile

Другой способ, если в вашем файле есть поля фиксированной длины и вы знаете «положение» каждого поля (например, если в вашем образце файла есть только пробелы, 11-е поле занимает 4 символа, с 57-го по 60-е в каждой строке)

awk '{print substr($0,1,56) v substr($0,61)}' v=$value file

или

sed -E "s/^(.{56}).{4}(.*)$/\1${value}\2/" infile
4
27.01.2020, 21:14

Я бы предложил использовать sed для вашей задачи:

file1="./Min1_1.traj_COP1A_.27.pdb"
file2="./COP1A_report1"
IFS=',' read -r a value b <"$file2"
#for second field:
sed "s/.[0-9]\b/$value/" "$file1" > TEST1
#for 11th field:
sed "s/\S.\.[0-9]\{2\}\b/$value/" "$file1" > TEST1
1
27.01.2020, 21:14

С помощью GAWK 4 вы можете сохранить разделители полей, явно разделив строку (или всю строку) и перебирая результат разделения (поля и разделители) для вывода.

В этом примере используются FPAT (регулярное выражение, определяющее структуру поля) и patsplit () , но можно использовать FS (регулярное выражение, определяющее разделитель полей или содержащее один пробел для представления [\ t \ n] + ) и split () вместо этого.

gawk "v=$value" '{n = patsplit($0, arr, FPAT, seps); arr[11] = v; for (i = 0; i <= n; i++) {printf "%s%s", a[i], seps[i]}; print ""}'

Обратите внимание, что a [0] всегда будет нулевым, seps [0] будет содержать любой начальный разделитель, а seps [n] будет любым разделителем символы (пробелы) в конце строки ввода. '

Вот единственная строка в более удобочитаемой форме:

gawk "v=$value" '
    {
        n = patsplit($0, arr, FPAT, seps); 
        arr[11] = v; 
        for (i = 0; i <= n; i++) {
            printf "%s%s", a[i], seps[i]
        }; 
        print ""
    }'
1
27.01.2020, 21:14

Теги

Похожие вопросы