Как я печатаю последние 5 полей в awk?

У меня есть 10 полей, и я хочу запуститься от поля 5 до поля 10 и проигнорировать первые 5 полей. Как я могу использовать NF в awk, чтобы сделать это?

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

Я хочу показать только:

f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
6
задан 22 December 2016 в 10:09

2 ответа

Необходимо циклично выполниться через поля:

bash-4.3$ awk '{for(i=6;i<=NF;i++) printf $i" "; print ""}' input_file.txt 
f6 f7 f8 f9 f10 
c6 c7 c8 c9 c10 

Или можно сделать поля равными Пустой строке:

bash-4.3$ awk '{for(i=1;i<=5;i++) $i="";print}' input_file.txt 
     f6 f7 f8 f9 f10
     c6 c7 c8 c9 c10

Или используйте подстроку целой строки, для печати всех символов от того, где поле 6 начинается (кредит к https://stackoverflow.com/a/12900372/3701431):

bash-4.3$ awk '{print substr($0,index($0,$6))}' input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

или просто используйте cut команда:

bash-4.3$ cut -d " " -f6-10  input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Python может сделать это также:

bash-4.3$ python -c 'import sys;fields=[" ".join(line.strip().split()[5:]) for line in sys.stdin];print "\n".join(fields)' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

или альтернативно:

$ python -c "import sys;print '\n'.join(map(lambda x:' '.join(x.split()[5:]),sys.stdin.readlines()))" < input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Или с Ruby:

bash-4.3$ ruby -ne 'print $_.split()[5..10].join(" ");print "\n"' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Bash + xargs может сделать это также, хотя немного более замысловатый:

bash-4.3$ cat input_file.txt | xargs -L 1 bash -c 'arr=($@);for i in $(seq 5 10);do printf "%s " ${arr[$i]} ; done; echo' sh
f6 f7 f8 f9 f10  
c6 c7 c8 c9 c10 
7
ответ дан 23 November 2019 в 07:30

Просто обработайте интересующие области. Это будет последним полем-4, последним полем-3, до фактического последнего поля.

Чтение из файла с этим содержанием ( file.txt ):

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

Выполнение awk на файле, как описано ниже. Строка с эти $ знак является командой. Последние две строки являются выводом.

$ awk '{print $(NF-4)" "$(NF-3)" "$(NF-2)" "$(NF-1)" "$NF}' file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Примечание : Как указано Cyrus в комментарии, я удалил сценарий удара и оставил просто оператор печати для создания его более простым и быстрее.

3
ответ дан 23 November 2019 в 07:30

Другие вопросы по тегам:

Похожие вопросы: