2016-07-27 4 views
0

Я пытаюсь следующую команду:AWK в то время как цикл не работает

while read file 
do 
awk -v ID="$file" '$1==ID{print $0}' input2 > output 
done < input1 

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

1 
2 
3 
4 

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

2 a b c 
3 a b c 
5 a b c 
6 a b c 

Выход должен выглядят так:

3 a b c 

Таким образом, если первый столбец ввода файла2 соответствует одному из значений из входного файла1, я хочу, чтобы вся строка из input2 напечаталась для вывода. Мой цикл while сверху только создает пустые файлы, однако ... В чем может быть проблема? Большое спасибо!

ответ

2

Выход разрушается при каждой итерации Использование >> вместо> или только последней итерации показывает

+0

Ах да, конечно, спасибо! – Abdel

3

Не делай этого, это очень неэффективно и хрупкими (см https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice). Вместо этого:

awk 'NR==FNR{ids[$0];next} $1 in ids' input1 input2 > output 
+1

+1! До недавнего времени я думал, что awk может обрабатывать только один входной файл. Я думаю, что большинство людей тоже игнорируют это, следовательно, конструкция 'while read'. –

+0

Да, к сожалению, многие люди считают awk просто причудливым grep или sed. Это намного больше, чем это, но это ** стандартный стандартный инструмент обработки текста UNIX. Я всегда рекомендую всем, кому, возможно, придется манипулировать текстом в UNIX, сначала прочитайте «Эффективное программирование Awk», 4-е издание, Арнольдом Роббинсом. Вероятно, это будет смена игры. –

+0

Определенно, хотя сейчас у нас немного старомодно, что у нас есть питон. Кстати, вы могли бы объяснить свой oneliner? Люди будут использовать несколько входных потоков больше, если поймут, как это работает. –

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