2015-12-06 6 views
1

У меня есть несколько файлов, как показано ниже. Я хотел бы извлечь значения $ 5 на основе $ 1.извлечение данных из столбца на основе другого столбца

file1

sam  60.2 143 40.4 19.8 
mathew 107.9 144 35.6 72.3 
baby 48.1 145 17.8 30.3 
rehna 47.2 146 21.2 26.0 
sam  69.9 147 .0  69.9 

file2

baby 58.9 503 47.5 11.4 
daisy 20.8 504 20.4 .4 
arch 61.1 505 12.3 48.8 
sam  106.6 506 101.6 5.0 
rehna 73.5 507 35.9 37.6 
sam  92.0 508 61.1 30.9 

Я использовал следующий код для извлечения $ 5.

awk '$1 == "rehna" { print $5 }' * 
awk '$1 == "sam" { print $5 }' * 

Я хотел бы получить на выходе, как показано ниже

rehna sam 
26.0 19.8 
37.6 69.9 
     5.0 
     30.9 

Как этого добиться? ваши предложения будут оценены!

ответ

1

Самый простой возможно paste результаты вместе:

#!/bin/bash 

function myawk { 
    awk -v name="$1" 'BEGIN {print name} $1 == name { print $5 }' file1 file2 
} 

paste <(myawk rehna) <(myawk sam) 

Запуск этого производит результаты, которые вы запросили (с TAB в качестве разделителя). См. paste документацию по другим параметрам.

0

Обновление: peak's answer с тех пор, завернутые этот подход в функции, в духе DRY. Если вам нужна дополнительная справочная информация, читайте дальше.

Предполагая, что Bash, Ksh или ЗШ в качестве оболочки:

printf '%s\t%s\n' 'rehna' 'sam' 
paste \ 
    <(awk '$1 == "rehna" { print $5 }' *) \ 
    <(awk '$1 == "sam" { print $5 }' *) 

выше производит Вкладка -разделенное выходе.

paste is a POSIX utility, который выводит соответствующие строки из его входных файлов, по умолчанию разделенные вкладками; например, paste fileA fileB выходы:

<line 1 from fileA>\t<line 1 from fileB> 
<line 2 from fileA>\t<line 2 from fileB> 
... 

Если любой входной файл запускается из линий, он поставляет пустые строки.

В данном случае соответствующие выходные данные команд awk используются в качестве входных файлов, используя process substitution (<(...)).

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