使用awk查找具有较少列的行

时间:2017-01-18 22:39:07

标签: shell awk

我有一个文件,每行有4个字段。如果字段数量较少,那么我想在带有行号的日志文件中写入该信息。

Filed1line1| Filed2line1| Filed3line1| Filed4line1
Filed1line2| Filed2line2| 
Filed1line3| Filed2line3| Filed3line3| Filed4line3 

类似于 - 行号2有3个字段用于文件a.txt

我们可以使用awk实现这一目标。

其实我使用的是以下代码段。如果字段数是<> 4然后我在一个坏文件中写它。这很好用。但我无法在日志中写入NR值。

 awk -F'|' -v DGFNM="$IN_DIR$DGFNAME" -v DBFNM="$IN_DIR$DBFNAME" '
    $1 == "DTL" {
     if (NF == 4) {
       print substr($0, 5) > DGFNM
     } else {
       print > DBFNM
       print NR >> $logfile
     }
    }
   ' "$IN_DIR$IN_FILE"

1 个答案:

答案 0 :(得分:1)

简单:NF是记录中的字段数,NR是记录号。

类似于:awk '{ if (NF < 4) { print "Row " NR " has " NF " fields"; } }' - 有更短的方式,但我更喜欢更长的代码,更容易阅读; - )

有关打印到不同输出文件的一些信息,请参阅此问题:is it possible to print different lines to different output files using awk

要回答您编辑的问题:$logfile在单引号内,因此它不会扩展到您的shell变量日志文件。它不是一个&#34; awk&#34;变量。在awk中尝试print NR >> "some_file";,然后稍后将some_file重命名为$ logfile。

另一种选择是使用扩展的$ logfile生成awk文件,而不是尝试内联。