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=]]
}
它的作用
^
匹配行的开头。
#?
匹配一或零 #
$
匹配行尾。
因此,^$
匹配空行,^#$
匹配只有 #
.
的行
我有以下内容,它忽略了只有 # 而不是那些有 \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=]]
}
它的作用
^
匹配行的开头。#?
匹配一或零#
$
匹配行尾。
因此,^$
匹配空行,^#$
匹配只有 #
.