2016-03-24 4 views
0

я file1 следующим образом,Заменить столбец из одного файла на столбец из другого файла?

ATOM  48 O ILE A 6  7.686 11.253 -7.457 1.00 27.81   O 
ATOM  49 CB ILE A 6  6.898 13.596 -9.634 1.00 26.66   C 
ATOM  50 CG1 ILE A 6  8.370 13.338 -9.831 1.00 24.73   C 
ATOM  51 CG2 ILE A 6  6.637 15.204 -9.788 1.00 26.32   C 
ATOM  52 CD1 ILE A 6  8.976 13.780 -11.270 1.00 32.46   C 

Теперь я хотел бы заменить $ 11 колонку с другим столбцом из file2, чтобы получить выходной сигнал следующим образом,

ATOM  48 O ILE A 6  7.686 11.253 -7.457 1.00 -28.81   O 
ATOM  49 CB ILE A 6  6.898 13.596 -9.634 1.00 30.66   C 
ATOM  50 CG1 ILE A 6  8.370 13.338 -9.831 1.00 -56.73   C 
ATOM  51 CG2 ILE A 6  6.637 15.204 -9.788 1.00 46.32   C 
ATOM  52 CD1 ILE A 6  8.976 13.780 -11.270 1.00 4.46   C 

file2 выглядит следующим образом,

-28.81 
30.66 
-56.73 
46.32 
4.46 

Я попытался написать этот код, работает нормально, но форматирование изменено.

for i in {1..798} 
do 
paste -d, <(awk -F' ' 'NR == '$i' {print $1 " " $2 " " $3 "  " $4 "  " $5 "  " $6 " " $7 " " $8 " " $9 " " $10 }' 1IV7_bfac_try.pdb) <(awk -F' ' ' NR == '$i' {print $0}' colm_awk) <(awk -F' ' 'NR == '$i' {print $12}' 1IV7_bfac_try.pdb) >> new 
done 

Любая помощь с awk или что-то было бы полезно, спасибо.

+0

Возможный дубликат [Заменить столбец в одном файле с колонкой от другого, используя AWK?] (Http://stackoverflow.com/questions/7846476/replace-column-in-one-file-with-column-from-another-using-awk) –

ответ

1

awk на помощь!

awk 'NR==FNR{c11[NR]=$1; next} {$11=c11[FNR]}1' file2 file1 
1

Как сказал here

Входной

:::::::::::::: 
f1 
:::::::::::::: 
ATOM  48 O ILE A 6  7.686 11.253 -7.457 1.00 27.81   O 
ATOM  49 CB ILE A 6  6.898 13.596 -9.634 1.00 26.66   C 
ATOM  50 CG1 ILE A 6  8.370 13.338 -9.831 1.00 24.73   C 
ATOM  51 CG2 ILE A 6  6.637 15.204 -9.788 1.00 26.32   C 
ATOM  52 CD1 ILE A 6  8.976 13.780 -11.270 1.00 32.46   C 
:::::::::::::: 
f2 
:::::::::::::: 
-28.81 
30.66 
-56.73 
46.32 
4.46 

Выходной

awk 'FNR==NR{a[NR]=$1;next}{$11=a[FNR]}1' f2 f1 

ATOM 48 O ILE A 6 7.686 11.253 -7.457 1.00 -28.81 O 
ATOM 49 CB ILE A 6 6.898 13.596 -9.634 1.00 30.66 C 
ATOM 50 CG1 ILE A 6 8.370 13.338 -9.831 1.00 -56.73 C 
ATOM 51 CG2 ILE A 6 6.637 15.204 -9.788 1.00 46.32 C 
ATOM 52 CD1 ILE A 6 8.976 13.780 -11.270 1.00 4.46 C 

Пояснение:

  • FNR==NR позволяет вам работать с одним целым файлом за раз. В этом случае это файл f2. NR и FNR оба содержат номера строк с разницей FNR сбрасывается до 1, когда считывается новый файл, где NR продолжает увеличиваться.
  • В то время как мы работаем с f2 файлом, мы создаем массив с именем a, используя номер строки (NR) как key и первый столбец ($1) в качестве значения. next позволяет нам пропустить остальную часть блока действий.
  • Как только f2 заканчивается, мы начинаем работу над файлом f1. NR==FNR Состояние не станет ложным, так как FNR будет увеличиваться с 1 до NR. Таким образом, будет обработан только одиннадцатый блок действий {$11=a[FNR]}.
  • Что делает этот блок, он переустанавливает второе значение столбца на значение массива, просматривая номер строки.
  • 1 в конце печатает линию. Он возвращает true, а в awk истинным операторам выводится печать строки.
  • f2 f1 - это порядок файлов. Поскольку мы хотим создать массив из файла f2, мы ставим его первым.

На форматированием, еще один интересный пример here

gawk ' 
NR==FNR { f1[NR]=$0; next } 
{ 
    split(f1[FNR],flds,FS,seps) 
    flds[11]=$1 
    for (i=1;i in flds;i++) 
     printf "%s%s", flds[i], seps[i] 
    print "" 
} 
' f1 f2 
+0

Это дает только столбец и столбец ATOM из файла2, но я просто хочу заменить столбец $ 11, почему нет опции печати в эта команда awk? –

+0

добавленный информация. Посмотрите, хотите ли вы импровизации – SriniV

Смежные вопросы