【问题标题】:How do I check if a field is empty or null in a text file using awk and bash如何使用 awk 和 bash 检查文本文件中的字段是否为空或 null
【发布时间】:2014-08-20 23:58:00
【问题描述】:

我有两个文本文件,我想根据它们的行和列比较它们的对应值。文本文件中的每个值(字段)都由制表符分隔。

这里是文件:

file1.txt

Name  Col1  Col2  Col3  
-----------------------
row1  1     4     7        
row2  2     5     8         
row3  3     6     9 

file2.txt

Name  Col1  Col2  Col3  
-----------------------
row2  1     4     11        
row1  2     5     12
row3  3          9 

这是我目前的代码:

awk '
FNR < 2 {next}                       
FNR == NR {           
    for (i = 2; i <= NF; i++) {
        a[i,$1] = $i;      
    }              
    next;       
}

# only compare if a row in file2 exists in file1
($1 in b) {                                          
    for (i = 2; i <= NF; i++) 
    {
        if (a[i,$1] == $i) 
        {
             print "EQUAL"       
        }
        else if ( //condition that checks if value is null// )
        {
             print "NULL" 
        }
        else
        {
             print "NOT EQUAL"
        }
    }
}' file1.txt file2.txt

我在检查file2.txt 中是否存在空值(file2.txt 中的row3col2)时遇到了困难。我什至没有得到那个空值的输出。到目前为止,我尝试了if ($i == ""),但它仍然没有给我任何输出。有什么建议?谢谢。 (我在 bash 脚本中使用 gnu awk)

如果需要进一步解释,请告诉我。

【问题讨论】:

  • @EdMorton 我已经提到每个文本文件中的值(或字段)由问题中的制表符分隔!它在问题的第一段。
  • 所以你做了,我没有注意到,我只是看到你的脚本没有使用制表符作为分隔符。
  • @EdMorton awk 不会自动检查制表吗?
  • 如果你的意思是 awk 默认使用制表符作为字段分隔符 - 不,它使用任何连续的空白字符序列。

标签: linux bash awk scripting suse


【解决方案1】:

只需将 FS 设置为选项卡:

awk -F'\t' '....'

【讨论】:

  • 我是否应该有以下条件来检查一个文件是否为空:if ($i == "") {//do something}
  • 我现在遇到的问题是每行的最后一个字段之后可能会有额外的表格。所以会有额外的输出不应该发生。我该如何解决?
  • @Alias:删除多余的标签。每个选项卡意味着有一个附加字段。 AWK 无法分辨您认为选项卡在哪里是字段,在哪里不是。你可以在最后去掉行,但是Col3 的缺失值呢?
猜你喜欢
  • 2014-08-23
  • 2015-12-28
  • 1970-01-01
  • 2012-12-29
  • 2012-04-15
  • 2016-11-04
  • 2012-12-06
  • 2014-07-28
  • 2022-11-02
相关资源
最近更新 更多