>我有以下内容,它忽略了只有#的行,但忽略了的行(空/仅包含换行符)
你知道我可以用一块石头打两只鸟的方法吗?即,如果行包含的字符不超过 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]
}
它的作用
^
匹配行的开头。#?
匹配一个或零个#
$
匹配行尾。
因此,^$
匹配空行,^#$
匹配只有 #
的行。