【问题标题】:AWK find if line is newline or #AWK 查找行是换行符还是 #
【发布时间】:2016-06-08 13:26:47
【问题描述】:

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

你知道我可以用一块石头击中两只鸟吗? IE。如果这些行不包含超过 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 有所不同,如果可以的话:)

这似乎比我预期的要难一些。

干杯, 本

【问题讨论】:

  • 顺便说一句,您可能希望改进格式,以便更轻松地遵循程序流程。
  • 这也是一个完整的程序,因为您似乎从未设置 dups 数组或向其中添加任何内容?实际上我无法弄清楚你在这个脚本中想要做什么?你能发布这个脚本应该解决的问题吗?
  • 以上更新。我想忽略 # 和 \n 字符,但不能让 \n 忽略。
  • Awk 看不到\n,因为默认情况下它是 RS,并在读取记录时被丢弃。检查空行的方法是/^$//^[[:space;]]*$/ 如果可以有空格。
  • 再次感谢小伙子的回答:D

标签: bash unix search awk newline


【解决方案1】:

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

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

更具体的可以写

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

它的作用

  • ^ 匹配行首。

  • #? 匹配一或零#

  • $ 匹配行尾。

所以,^$ 匹配空行,^#$ 匹配仅包含 # 的行。

【讨论】:

  • 谢谢,写得很漂亮,但在 awk 中似乎根本不起作用。
  • @BenCoughlan 如果您可以包含包含和示例输入以及预期输出,人们会更容易回答。您提供的 awk 脚本似乎包含一些可以避免的额外行。
  • 输入很一般,但在上面。
  • 非常感谢@nu11p01n73R 真的是一个很棒的教程。再次感谢:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 2016-10-29
  • 2018-06-20
  • 1970-01-01
  • 2022-06-28
相关资源
最近更新 更多