2013-04-18 8 views
1

Учитывая этот файлИгнорировать пустые поля

$ cat foo.txt 
,,,,dog,,,,,111,,,,222,,,333,,,444,,, 
,,,,cat,,,,,555,,,,666,,,777,,,888,,, 
,,,,mouse,,,,,999,,,,122,,,133,,,144,,, 

я могу напечатать первое поле, как так

$ awk -F, '{print $5}' foo.txt 
dog 
cat 
mouse 

Однако я хотел бы игнорировать эти пустые поля, так что я могу назвать, как это

$ awk -F, '{print $1}' foo.txt 

ответ

1
$ awk '{print $1}' FPAT=[^,]+ foo.txt 
dog 
cat 
mouse 
4

Вы можете использовать следующее:

$ awk -F',+' '{print $2}' file 
dog 
cat 
mouse 

Аналогичным образом вы можете использовать $ 3, $ 4 и $ 5 и т. Д. $ 1 не может быть использован в этом случае, потому что записи начинаются с разделителя.

+0

@sudo_O: Нет особых причин, как such..you прав, его делает это ясным внутри ... обновляя его ... – Guru

0
awk -F, '{gsub(/^,*|,*$/,"");gsub(/,+/,",");print $1}' your_file 

испытания ниже:

> cat temp 
,,,,dog,,,,,111,,,,222,,,333,,,444,,, 
,,,,cat,,,,,555,,,,666,,,777,,,888,,, 
,,,,mouse,,,,,999,,,,122,,,133,,,144,,, 

исполнение:

> awk -F, '{gsub(/^,*|,*$/,"");gsub(/,+/,",");print $1}' temp 
dog 
cat 
mouse 
+1

Это не сработает, если поля будут ',,,, dog ,, foo ,,, 111 ,,,, 222 ,,, 333 ,,, 444 ,, , ' – beny23

+0

@ beny23 ... good point.changed его для обработки этого сценария – Vijay

0

Вы можете удалить многократное повторение поля с tr -s 'field':

$ tr -s ',' < your_file 
,dog,111,222,333,444, 
,cat,555,666,777,888, 
,mouse,999,122,133,144, 

И тогда вы можете получить доступ к dog И т.д. с:

$ tr -s ',' < your_file | awk -F, '{print $2}' 
dog 
cat 
mouse 
+0

Я бы сделал' tr -s ',' <файл', чтобы удалить UUoC:] –

+0

Я пробовал 'tr -s ',' file' но не работает. Я знал, что может быть способ, спасибо @sudo_O! – fedorqui

+1

Yup, 'tr' только читает с' stdin', поэтому при чтении файлов требуется перенаправление! –

0
perl -anF,+ -e 'print "$F[1]\n"' foo.txt 
dog 
cat 
mouse 

это не AWK, но вы получите использовать 1 вместо 2.

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