AWK 查找行是换行符还是 #



>我有以下内容,它忽略了只有#的行,但忽略了的行(空/仅包含换行符)

你知道我可以用一块石头打两只鸟的方法吗?即,如果行包含的字符不超过 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 ("nnDuplicate 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 ("nnRepeated 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中改变一点:)

这似乎真的比我想象的要艰难一些。

干杯本

您可以将这两个if合并到一个正则表达式中。

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

更具体地说,您可以写

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

它的作用

  • ^ 匹配行的开头。

  • #? 匹配一个或零个#

  • $ 匹配行尾。

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

相关内容

  • 没有找到相关文章

最新更新