2012-06-01 3 views
3

Say есть входной файл с закладками разделителями поля, первое поле целоекак awk принимает результат команды unix в качестве параметра?

1 abc 
1 def 
1 ghi 
1 lalala 
1 heyhey 
2 ahb 
2 bbh 
3 chch 
3 chchch 
3 oiohho 
3 nonon 
3 halal 
3 whatever 

Во-первых, мне нужно вычислить отсчеты уникальных значений в первом поле, то это будет:

5 for 1, 2 for 2, and 6 for 3 

Тогда мне нужно найти максимальное из этих подсчетов, в данном случае это 6.

Теперь мне нужно передать «6» на другой AWK сценария как Parmeter.

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

cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort 

но как я получаю первый отсчет количества и передать его в следующей команде AWK в качестве параметра не в качестве входного файла ?

ответ

3

Этого сценарий AWK заменяет всю трубопровод:

awk -v parameter="$(awk '{a[$1]++} END {for (i in a) {if (a[i] > max) {max = a[i]}}; print max}' inputfile)" '{print parameter}' otherfile 

где '{print parameter}' является Standin для другого сценария AWK и «otherfile» является входом для этого сценария.

Примечание: Это чрезвычайно вероятно, что два сценария AWK могут быть объединены в одну, которая будет меньше рубить, чем делать это таким образом, как, например, изложенные в вашем вопросе (awk кормление awk).

+0

благодарит меня за помощь! :) Мне нравится, как вы вычисляете max. Согласен с вашей записью, есть ли способ написать функцию в одном скрипте awk, который также вызывает awk? Отличного тебе воскресенья! :) – trillions

+0

@nanshi: Вы не должны нуждаться во всех awk в awk, так как вы уже находитесь в awk. Существуют методы, которые используются для работы с несколькими файлами, обрабатывая каждый по-своему. Если вы отправляете вопрос, который спрашивает, как обрабатывать две части в одном скрипте и показывать, как эти части взаимодействуют, я или кто-то другой попытается ответить. –

+0

да, я отправлю еще один вопрос для этого! :) – trillions

2

Вы можете использовать подстановку $() команду командного интерпретатора:

awk -f script -v num=$(cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort | tail -1) < input_file 

(я добавил tail -1 для обеспечения используется, что не более одной строки.)

+0

так, чтобы последний файл input_file был еще одним awk-скриптом? как другой скрипт принимает значение в качестве параметра? Скажем, $ (...) оценивается как 6, но в следующем awk (то есть в файле сценария), как это берется 6 в качестве параметра? – trillions

+0

Большое спасибо за вашу помощь! Я выяснил свой последний вопрос :) сделать awk param = $() :) – trillions

+0

_another 'awk' script_ в моем примере хранится в' script'. Если вы хотите просто положить все это в командной строке, вы могли бы.Поскольку, похоже, вы еще не знали, как получить доступ к переменной из 'awk', я решил посмотреть немного дальше и обнаружил, что проще использовать' -v name = value', чтобы назначить переменную 'name' конкретной значение во время выполнения. Поэтому я отредактировал свой ответ, чтобы включить '-v num', просто получить доступ к переменной' num' из сценария. – sarnold

5

В этом нет ничего очень специфичны для AWK.

Либо программа может считывать данные из стандартного ввода, то вы можете пройти вход с трубой:

prg1 | prg2 

или ваша программа ожидает ввода в качестве параметра, то вы используете

prg2 $(prg1) 

Обратите внимание, что в оба случая prg1 обрабатываются до prg2.

Некоторые программы позволяют обе возможности, в то время как огромное количество данных редко передается как аргумент.

+0

Большое спасибо за вашу помощь! – trillions

+0

+1, но в случае трубы prg1 не обрабатывается * перед prg2. Они работают одновременно. Конечно, вероятно, что prg2 будет блокироваться при чтении и запуске после того, как prg1 выведет некоторые данные, поэтому вы почти всегда можете сказать, что prg2 обрабатывает данные после того, как prg1 видит это (но prg2 может игнорировать вывод из prg1), но весь точкой трубы является то, что вы получаете параллелизм бесплатно. –

+0

Ну, да, это было неправильно, но prg2 будет - если он будет строить для чтения входной блок до тех пор, пока не поступит вход, и если prg1 закончит после создания последнего выхода, он произведет весь вывод, передаст его prg2, который может быть достаточно быстрым, чтобы закончить до prg1 в состоянии гонки, но с точки зрения производителя-потребителя prg1 будет производителем и prg2 потребителем. Часто бывает более интересно, что вам не нужно хранить все данные в памяти при выполнении обеих программ, чем скорость параллельного вызова. –

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