2013-08-11 2 views
0

У меня есть два файла: ФАЙЛ1 и file2 следующим образом:Matching поля через несколько файлов

 
file1     file2 
orangejuice    orangejuice_9.88_9.88 
pineapplejuice   appleslices_6.3_2.2 
appleslices    pineapplejuice_1.2_3.9 
Mangojuice    Mangojuice_5.55_5.55 

Вывод должен быть:

 
orangejuice_988 
pineapplejuice_120_390 
appleslices_630_220 
Mangojuice_555 

Во время чтения построчно из file1, поиск шаблона найденный в строке file1 в файле2, после того, как найденный сравнивает 2-й и 3-ый поля файла2, если они один и тот же, напечатайте один раз, если не печатают два числа. (Число должно быть умножено на 100 в любом случае)

Я думал об этом:

while read -r -u 3 line1 
do 
nawk ' "$line1" print $0}' file2.txt 
if "$2" == "$3" 
then echo "scale=2;$2*100" |bc 
else echo "$2_$3" 
fi 
done 3<file1.txt 

Итак, я хочу знать, если логика верна и зафиксировать умножение, которое дало бы мне 988 вместо 988.0.

ответ

1

Один из способов с GNU awk:

$ awk 'NR==FNR{a[$0];next}($1 in a){print $1,$2==$3?$2*100:$2*100OFS$3*100}' FS=_ OFS=_ file1 file2 
orangejuice_988 
appleslices_630_220 
pineapplejuice_120_390 
Mangojuice_555 
+0

Приведенный выше код дает ошибку – t28292

+1

Нет, приведенный выше код отлично работает с вашим вводом и 'GNU awk'. Либо вы не используете 'GNU awk', то есть у вас есть Mac, или ваш вопрос не отражает ваши фактические данные. 'вышеуказанный код дает ошибку' для меня совершенно бесполезен, какая ошибка? Какая версия или 'awk' у вас есть? какую систему вы используете? –

+0

У меня есть solaris, поэтому я использую nawk – t28292

1

Ваша логика гораздо проще выразить исключительно в Awk. Предполагая, что роль file1 заключается в ограничении данных от file2 только некоторыми записями (ваш пример, похоже, не демонстрирует этого), попробуйте что-то вроде этого.

awk -F _ '# Make OFS equal to FS 
    BEGIN { OFS=FS } 
    # Read file1 into a[] 
    NR==FNR { a[$0]++; next } 
    # If we fall through to here, we are in file2 
    # On any lines where $1 is in a[] 
    a[$1] { 
     if ($2==$3) print $1, $2*100; 
     else print $1, $2*100, $3*100; 
    }' file1 file2 
+0

У меня есть еще один вопрос, где я могу хранить выходные я обычно использую >> file3.txt, но где я могу разместить его? – t28292

+0

В любом месте, но обычно в конце команды. – tripleee

+0

Приведенный выше код не дает мне никаких результатов при запуске скрипта – t28292

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