用awk提取列

时间:2012-10-14 14:08:12

标签: awk

我有一些文本文件如下

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

5 个答案:

答案 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

您可以移植部件以显示文件名。