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

Это продолжение unix: замените один полный столбец в одном файле одним значением из другого файла

Я пытаюсь заменить один столбец файла (file1) на одно конкретное значение из другого файла (file2).

file1 структурирован следующим образом:

HETATM 8 P FAD B 600 98.424 46.244 76.016 1.00 18.65 HETATM 9 O1P FAD B 600 98.634 44.801 75.700 1.00 17.69 O HETATM 10 O2P FAD B 600 98.010 46.640 77.387 1.00 15.59 O HETATM 11 H5B1 FAD B 600 96.970 48.950 72.795 1.00 -1.00 H 

и мне абсолютно необходимо сохранить эту структуру.

file2 структурирован следующим образом:

 1 27, -81.883, 4.0 5 48, -67.737, 20.0 1 55, -72.923, 4.0 4 27, -62.64, 16.0 

Я заметил, что awk «плохо себя ведет» и теряет формат моего файла pdb, что означает, что вместо:

 HETATM 1 PA FAD B 600 95.987 47.188 74.293 1.00 -73.248 

я получил

 HETATM 1 PA FAD B 600 95.887 47.194 74.387 1.00 -73.248 

Я пытался:

 file1="./Min1_1.traj_COP1A_.27.pdb" file2="./COP1A_report1" value="$(awk -F, 'NR==1{print $2;exit}' $file2)" #option 1: replaces the column I want but messes up the format awk -F ' ' '{$11 = v} 1' v="$value" $file1 >TEST1 #option 2: keeps the format but adds the value at the end only awk -F ' ', '{$2 = v} 1' v="$value" $file1 >TEST2 awk -F, '{$11 = v} 1' v="$value" $file1 >TEST3 

Я предполагаю, что это связано с тем, что файл pdb не имеет одинаковых разделителей для всех столбцов, и awk не имеет дело с тем, как я этого хочу.

Любые идеи о том, как «приручить» awk для этой проблемы или какую другую команду использовать?

3 Solutions collect form web for “Замените столбец и сохраните интервал”

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

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

То же самое с 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 

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

 file1="./Min1_1.traj_COP1A_.27.pdb" file2="./COP1A_report1" IFS=',' read -ra 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 

С помощью 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 "" }' 
  • awk, как изменить значение файла с помощью наборов параметров?
  • Вставить текст в определенные строки файла?
  • Как обнаружить и удалить символ новой строки в столбце в файле csv?
  • помощь awk для печати из определенного столбца до конца
  • Сравните два файла с первым столбцом и удалите повторяющуюся строку из второго файла в сценарии оболочки
  • Как суммировать значения двух строк в строке в linux
  • Как работает следующий сценарий оболочки для поиска всех файлов размером более 20 МБ?
  • Считать дубликаты строк с ограничением
  • Извлеките и форматируйте данные с помощью `cut` и` awk`
  • Выберите каждые две строки, если они начинаются с того же имени
  • Кудрявая скобка путаницы!
  • совокупные суммы со сдвинутой колонкой
  • Linux и Unix - лучшая ОС в мире.