Bash AWK查找行是换行还是换行#

Bash AWK查找行是换行还是换行#,bash,unix,search,awk,newline,Bash,Unix,Search,Awk,Newline,我有以下内容,它忽略了带有#的行,而不是带有\n的行(空/仅包含换行符) 你知道我能一石二鸟的方法吗? 即,如果行包含的字符数不超过1个,则删除该行 function check_duplicates { awk ' FNR==1{files[FILENAME]} {if((FILENAME, $0) in a) dupsInFile[FILENAME] else {a[FILENAME, $0] du

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

你知道我能一石二鸟的方法吗? 即,如果行包含的字符数不超过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有所不同:)

这真的比我想象的要困难一些

干杯,
Ben

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

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

更具体地说,你可以写

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

  • ^
    匹配行首

  • #?
    匹配一个或零个
    #

  • $
    与行尾匹配


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

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

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

更具体地说,你可以写

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

  • ^
    匹配行首

  • #?
    匹配一个或零个
    #

  • $
    与行尾匹配



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

的行,作为一种旁白,您可能希望改进格式,以便更容易遵循程序流程。这也是一个完整的程序,因为您似乎从未设置dups数组或向其中添加任何内容?事实上,我根本搞不懂你在这个脚本中想做什么?你能发布这个脚本应该解决的问题吗?上面的更新。我想忽略#和\n字符,但无法让\n字符忽略。Awk无法看到
\n
,因为默认情况下它是RS,在读取记录时会被丢弃。检查空行的方法是
/^$/
/^[:space;]]*$/
(如果可以有空格)。再次感谢guy's,答案是:作为一种旁白,您可能希望改进格式,以便更容易地遵循程序流程。这也是一个完整的程序,因为您从未设置dups数组或向其添加任何内容?事实上,我根本搞不懂你在这个脚本中想做什么?你能发布这个脚本应该解决的问题吗?上面的更新。我想忽略#和\n字符,但无法让\n字符忽略。Awk无法看到
\n
,因为默认情况下它是RS,在读取记录时会被丢弃。检查空行的方法是
/^$/
/^[:space;]]*$/
(如果可以有空格)。再次感谢guy的回答:DThanks,写得很漂亮,但在awk中似乎根本不起作用。@BenCoughlan如果可以包含示例输入和预期输出,人们回答起来会容易得多。您提供的awk纸条似乎包含一些可以避免的额外行。输入非常通用,但在上面。非常感谢@nu11p01n73R,这是一个非常棒的教程。再次感谢:DThanks,写得很漂亮,但它在awk中似乎根本不起作用。@BenCoughlan如果您能包括include和example输入以及预期输出,人们回答起来会容易得多。您提供的awk纸条似乎包含一些可以避免的额外行。输入非常通用,但在上面。非常感谢@nu11p01n73R,这是一个非常棒的教程。再次感谢:D