我有两个80,000多个记录长度相同的大文件。我需要逐行比较文件的前8个字符。文件一的第一行是与文件二的第一行比较。文件一的第二行与文件二的第二行相比较。
示例文件1
01234567blah blah1
11234567blah blah2
21234567blah blah3
31234567blah blah4
示例文件2
31234567blah nomatch
11234567matchme2
21234567matchme3
31234567matchme4
第2 - 4行应该匹配,但第1行不应该匹配。我的脚本将第1行与第4行匹配,但应与第1行进行比较。
awk '
FNR==NR {
a[substr($0,1,8)]=1;next
}
{if (a[substr($0,1,8)])print $0; else print "Not Found", $0;}
' $inputfile1 $inputfile2 > $outputfile1
谢谢。
答案 0 :(得分:1)
对于逐行比较,您需要使用FNR
变量作为键。尝试:
awk 'NR==FNR{a[FNR]=substr($1,1,8);next}{print (a[FNR]==substr($1,1,8)?$0:"Not Found")}' file1 file2
Not Found
11234567matchme2
21234567matchme3
31234567matchme4
答案 1 :(得分:0)
awk 'BEGIN{
while(1){
f=getline<"file1";
if(f!=1)exit;
a=substr($0,1,8);
f=getline<"file2";
if(f!=1)exit;
b=substr($0,1,8);
print a==b?$0:"Not Found"FS$0}}'
如果成功将子字符串存储在file1
中,那么从a
读取一行,如果成功将子字符串存储在file2
中,则从b
读取一行,然后检查是否{{1} }和a
相等或不相同,并打印输出。
输出:
b
答案 2 :(得分:0)
如果某个文件中没有单个字符,则可以将其用作分隔符,例如示例中的:
和paste
/ awk
组合:
paste -d: data data2 | awk -F: '{prefix=substr($1,1,8)!=substr($2,1,8) ? "Not Found"OFS : ""; print prefix $2}'
:
分隔符:
分隔符prefix
prefix
的“未找到”(+ OFS
)。