Замена определенного столбца файла на столбец другого файла с помощью sed в linux - PullRequest
1 голос
/ 27 марта 2012

У меня есть два файла.

file1 содержит данные, подобные приведенным ниже, содержащие только один столбец.

112.319
108.915
105.512

file2 содержит данные, подобные приведенным ниже, содержащие восемь столбцов.

0.000000     0.000     0.000     0.000     0.000         0     0.0001.0000E+20  
0.000000     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20  
0.000000     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20 

Я хочу заменить первый столбец файла2 на первый столбец файла1, и результат будет

112.319     0.000     0.000     0.000     0.000         0     0.0001.0000E+20  
108.915     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20  
105.512     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20

Я попытался заменить первую запись каждой строки первой записью другой строки, ноне удалосьЯ был бы благодарен, если бы кто-нибудь мог помочь мне, используя sed.

С наилучшими пожеланиями.

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Вы можете использовать команды paste / tr / cut / column:

$ paste file{1,2} | tr -s ' ' | cut -d ' ' -f 1,3- | column -t
112.319  0.000000  0.000  0.000  0.000      0  0.0001.0000E+20
108.915  0.000000  0.000  0.000  20.000000  0  0.0001.0000E+20
105.512  0.000000  0.000  0.000  20.000000  0  0.0001.0000E+20
1 голос
/ 27 марта 2012

Это может работать для вас:

 cut -d' ' -f2- file2 | paste -d' ' file1 -

или это (GNU sed):

sed 'R file2' file1 | sed 'N;s/\n\S*//'

или это:

 awk 'FNR==NR{a[NR]=$1;next};{sub($1,a[FNR])}1' file1 file2

РЕДАКТИРОВАТЬ:

Это может работать для вас: (GNU sed?)

sed '=;s/.*/s|\\S*|&|/' file1 | sed 'N;s/\n//' | sed -i -f - file2
1 голос
/ 27 марта 2012
join -o 1.2,2.3,2.4,2.5,2.6,2.7,2.8 <(cat -n file1) <(cat -n file2) | column -t

производит

112.319  0.000  0.000  0.000  0.000      0  0.0001.0000E+20
108.915  0.000  0.000  0.000  20.000000  0  0.0001.0000E+20
105.512  0.000  0.000  0.000  20.000000  0  0.0001.0000E+20

Обновление: поскольку пробелы значительны, вы можете использовать замены строк. Вот awk:

awk 'NR==FNR {n[FNR]=$1; next} {sub(/[^[:space:]]+/, n[FNR]); print}' f1 f2

производства

112.319     0.000     0.000     0.000     0.000         0     0.0001.0000E+20
108.915     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20
105.512     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...