AWK 查找行是换行符还是#

AWK find if line is newline or #

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

你知道我用一块石头打两只鸟的方法吗? IE。如果这些行不包含超过 1 个字符,则删除该行..

function check_duplicates {

awk '
  FNR==1{files[FILENAME]}
         {if((FILENAME, [=10=]) in a) dupsInFile[FILENAME]
          else
            {a[FILENAME, [=10=]]
             dups[[=10=]] = [=10=] in dups ? (dups[[=10=]] RS FILENAME) : FILENAME
             count[[=10=]]++}}
              {if ([=10=] ~ /#/) {
                  delete dups[[=10=]]
               }}
 #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[[=10=]]++
   }
       [=10=] in b {
          if ([=10=] ~ /#/) {
          delete b[[=10=]]
                        }
                     if (b[[=10=]]>1) {
                     print ("\n\nRepeated line found: "[=10=]) " - In the following file"
                     print FILENAME
                     delete b[[=10=]]
                     } 
   }' $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,我正在做大量的 post 处理,并且不想在这一点上与 awk 有所不同,如果可以的话:)

确实比我想象的要难一些。

干杯, 本

您可以将 if 组合成一个正则表达式。

if ([=10=] ~ /#|\n/) {
    delete dups[[=10=]]
}

更具体的你可以写

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

它的作用

  • ^ 匹配行的开头。

  • #? 匹配一或零 #

  • $ 匹配行尾。

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

的行