Linux Awk问题,一次在多个文件中复制行。
我对下面的输出格式有问题 我在很多文件SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c中都有重复的行,但是可以有很多很多 三个文件中都存在行“test1”,字符串“sample”也存在 行“test”存在于两个文件中,但在其中一个文件中存在不止一次,我希望每个文件名只输出一次Linux Awk问题,一次在多个文件中复制行。,linux,bash,awk,duplicates,printf,Linux,Bash,Awk,Duplicates,Printf,我对下面的输出格式有问题 我在很多文件SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c中都有重复的行,但是可以有很多很多 三个文件中都存在行“test1”,字符串“sample”也存在 行“test”存在于两个文件中,但在其中一个文件中存在不止一次,我希望每个文件名只输出一次 function check_duplicates { awk 'END { for (R in rec) { #split out the SHORT_LIST files
function check_duplicates {
awk 'END {
for (R in rec) {
#split out the SHORT_LIST files
n = split(rec[R], t, "/SHORT_LIST")
#printf n dup[n]
count = 0
if ( n > 2 )
dup[n] = dup[n] ? dup[n] RS sprintf( R, rec[R]) :
sprintf("\t%-20s %s ", R, rec[R]);
}
for (D in dup) {
((count++))
printf "%s\n \n", d
printf count " ). Duplicate record(s) found in the following files: " dup[D]
}
}
{
# build an array named rec (short for record), indexed by
# the content of the current record ($0), concatenating
# the filenames separated by / as values
rec[$0] = rec[$0] ? rec[$0] "\n \t" FILENAME : FILENAME
}' $SITEFILES
}
check_duplicates
以下电流输出:
在以下文件中找到重复记录:
(一)。在以下文件中找到重复记录:test1短名单 短名单 短名单 样品 (二)。在以下文件中发现重复记录:test
短名单 短名单 短名单 短名单 (三)。在以下文件中找到重复记录:/path/to/file
短名单 短名单 种皮 以下所需输出: 在以下文件中找到重复记录: (一)。在以下文件中找到重复记录:test1
短名单 短名单 短名单 (二)。在以下文件中发现重复记录:示例
短名单 短名单 短名单 (三)。在以下文件中发现重复记录:test
短名单 短名单 (四)。在以下文件中找到重复记录:/path/to/file
短名单 短名单 (五)。在以下文件中找到重复记录:testa 短名单 短名单 如果您有任何建议,我将不胜感激,我对这个级别的AWK有困难
You can follow this template and fix the output format as desired
$ awk -f dups.awk fa fb fc
dups for : /path/to/file in files
fa fc
dups for : test in files
fa fb fc
dups for : sample in files
fa fb fc
no dups in
fc
$ cat dups.awk
FNR==1{files[FILENAME]}
{if((FILENAME, $0) in a) dupsInFile[FILENAME]
else
{a[FILENAME, $0]
dups[$0] = $0 in dups ? (dups[$0] FS FILENAME) : FILENAME
count[$0]++}}
END{for(k in dups)
{if(count[k] > 1)
{print ("dups for : " k) " in files"
print dups[k]}}
for(f in dupsInFile) delete files[f];
print "no dups in";
for(f in files) printf "%s", f FS;
printf "\n";
}
在哪里
$headf{a,b,c}
==>fa-fb-fc
在哪里
$headf{a,b,c}
==>fa fb fc可能类似
awk '{print FILENAME "\t" $0}' $SITEFILES \
| sort \
| uniq -c -f1 \
| awk "{if ($1 + .0 != 1) print $0}'
会让你开始的
如果没有小样本数据集,在这方面做更多的工作是不现实的
也许是这样的
awk '{print FILENAME "\t" $0}' $SITEFILES \
| sort \
| uniq -c -f1 \
| awk "{if ($1 + .0 != 1) print $0}'
会让你开始的
如果没有小样本数据集,在这方面做更多的工作是不现实的
IHTH我将其分为多个文件,在同一个文件中,我还添加了一些内容,以允许忽略注释,您也可以使用空白等
非常感谢@karakfa,你的回答太棒了,谢谢
function check_duplicates {
#Check multiple files for 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]++}}
#ignore comment lines
{if ($0 ~ /#/) {
delete dups[$0]
}}
#Print duplicates in more than one file
END{for(k in dups)
{if(count[k] > 1)
{print ("\n\n\tDuplicate line found: " k) "\n\tIn the following file(s)"
print dups[k] }}
printf "\n";
}' $SITEFILES
#Check single files for duplicates.
awk '
NR {
b[$0]++
}
#ignore comment lines
$0 in b {
if ($0 ~ /#/) {
delete b[$0]
}
if (b[$0]>1) {
print ("\n\n\tDuplicate line found: "$0) "\n\tIn the following file"
print FILENAME
delete b[$0]
}
}' $SITEFILES
}
我把它分为多个文件,在同一个文件中,我还加入了一些东西,以允许忽略注释,你也可以用空白来做这件事,等等
非常感谢@karakfa,你的回答太棒了,谢谢
function check_duplicates {
#Check multiple files for 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]++}}
#ignore comment lines
{if ($0 ~ /#/) {
delete dups[$0]
}}
#Print duplicates in more than one file
END{for(k in dups)
{if(count[k] > 1)
{print ("\n\n\tDuplicate line found: " k) "\n\tIn the following file(s)"
print dups[k] }}
printf "\n";
}' $SITEFILES
#Check single files for duplicates.
awk '
NR {
b[$0]++
}
#ignore comment lines
$0 in b {
if ($0 ~ /#/) {
delete b[$0]
}
if (b[$0]>1) {
print ("\n\n\tDuplicate line found: "$0) "\n\tIn the following file"
print FILENAME
delete b[$0]
}
}' $SITEFILES
}
我不知道这有什么用?我需要列出副本和它所在的每个文件。记下我的原始评论。可能类似于sort-o file.srt文件;排序文件2.srt文件2;comm-12 file.srt file2.srt>file1_2.comm;awk{print“dups:$0}文件1_2.comm将允许您使用标准工具,而不是“重新发明轮子”;-)。您必须花时间阅读comm
,以确定是否可以让它的输出为您服务。祝你好运。问题是,我正在通过$SITEFILES传递预先确定的文件,它们在开始时被传递到一个更大的脚本中,并且可以按名称、日期、大小等进行排列。所以我不能只给它一些文件名,因为有时我会有一个文件,有时我会有5000个,这取决于之前的处理过程。@ben,发布一些示例文件会使您更容易获得帮助。但我不确定这会有什么帮助?我需要列出副本和它所在的每个文件。记下我的原始评论。可能类似于sort-o file.srt文件;排序文件2.srt文件2;comm-12 file.srt file2.srt>file1_2.comm;awk{print“dups:$0}文件1_2.comm将允许您使用标准工具,而不是“重新发明轮子”;-)。您必须花时间阅读comm
,以确定是否可以让它的输出为您服务。祝你好运。问题是,我正在通过$SITEFILES传递预先确定的文件,它们在开始时被传递到一个更大的脚本中,并且可以按名称、日期、大小等进行排列。所以我不能只给它一些文件名,因为有时我会有一个文件,有时我会有5000个,这取决于之前的处理过程。@ben,发布一些示例文件将使您更容易获得帮助。哇,谢谢,这太完美了嗯,知道我怎么能在同一个文件里找到复制品吗?或者如何在文件名之间添加换行符?i、 e.“fa”\n“fb”\n“fc”即fb在其中有两次测试,对于这些文件中的每一行,都会启动一个作业,因此在每个文件中捕获重复项也很重要。如果这有意义的话?我从你的“行”测试中了解到“存在…每个文件名只输出一次。”声明是你不想在一个文件中报告重复项。哦,对不起,在翻译中丢失了,那么,我想a)在多个文件中报告重复项,B)在每个文件中报告重复项。我希望这是有道理的。另外,出于好奇,其中包含文件名的数组dups[k],您知道如何在每行打印这些元素吗?您的格式是单行:对于每个文件名的单独行:将“FS”替换为“RS”。对于同一文件中的重复项,可以使用dupsInFile array处理该部分,该部分将保留存在重复项的文件名。将条目存储在另一个按文件名索引的数组中,类似于dups数组。哇,谢谢,这太完美了嗯,知道我怎么能在同一个文件里找到复制品吗?或者如何在文件名之间添加换行符?i、 e.“fa”\n“fb”\n“fc”即fb在其中有两次测试,对于这些文件中的每一行,都会启动一个作业,因此在每个文件中捕获重复项也很重要。如果这有意义的话?我对你的“行”测试的理解是“存在…每个文件名只输出一次。”声明是你不想在一个文件中报告重复项。哦,对不起,在翻译中丢失了,我想a)在多个文件中报告重复项