0

我有一些文本文件如下

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
4

4 回答 4

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
于 2012-10-14T14:36:45.093 回答
1

无论如何,这都不是一个优雅的解决方案,它特定于这个文件。

你可以做这样的事情

cut -c1-15 yourtext | awk '$5 {print $4}'

其中 15 是包括第 5 列在内的字符数。

我非常同意steve的建议,即为您的文件使用更好的替代方案。或者至少放置一个虚拟/错误值,而不是将列留空。

于 2012-10-14T19:50:41.553 回答
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>
于 2012-10-15T10:41:49.790 回答
0

这是假设列号的变化保持不变的起点。

awk '$5 !="" && NF<=8 {printf $4}END{print "\n"}' data.txt

产量

ARP

您可以嫁接零件以显示文件名。

于 2012-10-14T14:21:05.240 回答