2016-01-06 1 views
2
#file test.txt 

    a b c 5  
    d e f g h 7 
    gg jj 2 

Say X = 3 Мне нужен выход, как это:ОБНОВЛЕНО: Bash + Awk: Печать первой X (динамические) колонны и всегда последний столбец

#file out.txt 
    a b c 5 
    d e f 7 
    gg jj 2 

НЕ это:

a b c 5 
d e f 7 
gg jj 2 2 <--- WRONG 

я получил на этом этапе:

cat test.txt | awk ' { print $1" "$2" "$3" "NF } ' 
+0

'awk' может читать файлы, не требуя' cat' их и отправлять через трубу. Идиоматическая техника - это 'awk '{...}' file1' или' awk '{...}' file1 file2' и т. Д. –

ответ

2

Если вы не уверены, от общего количества полей, то один из вариантов было бы использовать цикл:

awk '{ for (i = 1; i <= 3 && i < NF; ++i) printf "%s ", $i; print $NF }' file 

Петля можно избежать с помощью тройного :

awk '{ print $1, $2, (NF > 3 ? $3 OFS $NF : $3) }' file 

Это немного более многословным, чем the approach suggested by 123, но означает, что вы не остались завершающие пробелы на линиях с тремя полями. OFS - это разделитель выходного поля, по умолчанию это пробел, который print вставляет между полями при использовании ,.

1

Использовать $ в сочетании с NF:

cat test.txt | awk ' { print $1" "$2" "$3" "$NF } ' 
+0

или использовать выходной полевой разделитель: 'awk '{OFS =" "; print $ 1, $ 2, $ 3, $ NF} 'file' – Cyrus

+0

@Cyrus В любом случае, по умолчанию OFS, нет необходимости его устанавливать. – 123

+0

@ 123: Да, это нормально: 'awk '{print $ 1, $ 2, $ 3, $ NF}' file'. Спасибо. – Cyrus

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