我有一些文本文件如下
293 800 J A 0 0 162
294 801 J R - 0 0 67
295 802 J P - 0 0 56
298 805 J G S S- 0 0 22
313 820 J R T 4 S- 0 0 152
如果column5为空,我想打印column4。
desired output
>filename
ARP
我使用了以下代码。但是这段代码只打印文件名。
awk '{
if (FNR == 1 ) print ">" FILENAME
if ($5 == "") {
printf $4
}
}
END { printf "\n"}' *.txt
答案 0 :(得分:2)
这是使用GNU awk
的一种方式:
awk 'BEGIN { FIELDWIDTHS="5 4 2 3 3 2 7 4 3" } FNR==1 { print ">" FILENAME } $5 == " " { sub(/ $/, "", $4); printf $4 } END { printf "\n" }' file.txt
结果:
>file.txt
ARP
答案 1 :(得分:1)
哪些字符将您的“列”分开?请记住,默认情况下,awk会将任何连续的空白字符序列视为字段分隔符,因此如果您的字段(列)由空白字符序列分隔,则除非您的字段已修复,否则awk无法判断字段何时丢失宽度,然后你可以使用substr()或gawk的FIELDWIDTHS或类似的来识别字段所在的位置。
答案 2 :(得分:1)
这绝不是一个优雅的解决方案,它特定于此文件。
你可以做这样的事情
cut -c1-15 yourtext | awk '$5 {print $4}'
其中15是包括第5列的字符数。
我非常同意steve建议为您的文件使用更好的替代方案。或者至少放一个虚拟/错误值而不是将列留空。
答案 3 :(得分:1)
awk '{if(substr($0,15,1)~/ /)printf("%s",$4);}' your_file
测试如下:
> cat temp
293 800 J A 0 0 162
294 801 J R - 0 0 67
295 802 J P - 0 0 56
298 805 J G S S- 0 0 22
313 820 J R T 4 S- 0 0 152
> awk '{if(substr($0,15,1)~/ /)printf("%s",$4);}' temp
ARP>
答案 4 :(得分:0)
这是一个起点,假设列数的变化保持不变。
awk '$5 !="" && NF<=8 {printf $4}END{print "\n"}' data.txt
产量
ARP
您可以移植部件以显示文件名。