我有以下内容,它只忽略带#的行而不是那些带\ 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中改变这一点,如果可以的话:)它似乎比我预期的要强硬一些。
干杯, 本
答案 0 :(得分:2)
您可以将if
合并为一个正则表达式。
if ($0 ~ /#|\n/) {
delete dups[$0]
}
OR
更具体地说,你可以写
if ($0 ~ /^#?$/) {
delete dups[$0]
}
它的作用
^
匹配行的开头。
#?
匹配一个或零#
$
匹配行尾。
因此,^$
匹配空行,^#$
匹配只有#
的行。