AWK查找行是否为换行符或#

时间:2016-06-08 13:26:47

标签: bash unix search awk newline

我有以下内容,它只忽略带#的行而不是那些带\ n的行(空/只包含换行符)

你知道我可以一石二鸟的方式吗? I.E.如果这些行不包含多于1个字符,则删除该行..

function check_duplicates {

awk '
  FNR==1{files[FILENAME]}
         {if((FILENAME, $0) in a) dupsInFile[FILENAME]
          else
            {a[FILENAME, $0]
             dups[$0] = $0 in dups ? (dups[$0] RS FILENAME) : FILENAME
             count[$0]++}}
              {if ($0 ~ /#/) {
                  delete dups[$0]
               }}
 #Print duplicates in more than one file
         END{for(k in dups)
            {if(count[k] > 1)
              {print ("\n\nDuplicate line found: " k) " - In the following file(s)"
                print dups[k] }}
         printf "\n";
      }' $SITEFILES

awk '
NR {
    b[$0]++
   }
       $0 in b {
          if ($0 ~ /#/) {
          delete b[$0]
                        }
                     if (b[$0]>1) {
                     print ("\n\nRepeated line found: "$0) " - In the following file"
                     print FILENAME
                     delete b[$0]
                     } 
   }' $SITEFILES

 }

预期输入通常如下。

 #File Path's
 /path/to/file1
 /path/to/file2
 /path/to/file3
 /path/to/file4



 #
 /more/paths/to/file1
 /more/paths/to/file2
 /more/paths/to/file3
 /more/paths/to/file4
 /more/paths/to/file5
 /more/paths/to/file5

在这种情况下,/ more / paths / to / file5会出现两次,并且应该被标记为这样。

然而,还有许多新行,我宁可忽略。

呃,它也必须是awk,我做了一大堆的后期处理,并且不想从awk中改变这一点,如果可以的话:)

它似乎比我预期的要强硬一些。

干杯, 本

1 个答案:

答案 0 :(得分:2)

您可以将if合并为一个正则表达式。

if ($0 ~ /#|\n/) {
    delete dups[$0]
}

OR

更具体地说,你可以写

if ($0 ~ /^#?$/) {
    delete dups[$0]
}

它的作用

  • ^匹配行的开头。

  • #?匹配一个或零#

  • $匹配行尾。

因此,^$匹配空行,^#$匹配只有#的行。