我有两个文件,我试图逐行比较每个字符串。 File1仅包含6个字符的字符串前缀,而File2包含12个字符的字符串。如何遍历File2以查找以File1中的6个字符开头的字符串并将其输出到文件中?
002379
005964
002379ED6212
003354EB4591
004679BB2185
005964AB3379
005964DB5496
答案 0 :(得分:2)
awk
或许可以实现此目标
awk 'NR == FNR {a[$0]; next};substr($0, 1, 6) in a' File1 File2
答案 1 :(得分:2)
这个awk单行做你想做的事:
awk 'NR==FNR{a[$0];next}{for(i in a)if(substr($0,1,6)==i)print}' file1 file2
NR==FNR
仅适用于第一个文件。 file1
的每一行都存储为数组a
中的一个键。 next
跳过另一个区块。对于第二个文件中的每个记录,循环遍历a
中的每个键并比较前6个字符。如果它们相同,则打印记录。
输出:
002379ED6212
005964AB3379
005964DB5496
答案 2 :(得分:2)
grep -f <(sed 's/^/^/' file1) file2
最好使用grep -f
来查找file2中与file1中的正则表达式匹配的所有行,但是您希望将file1中的正则表达式锚定到行的开头。因此,使用上面的方法通过添加锚来预处理字符串。
答案 3 :(得分:2)
对于纯Bash解决方案。 。 。假设您正在使用Bash v4.x,您可以先填充一个关联数组,其键是File1
行:
declare -A prefixes
while read prefix ; do
prefixes[$prefix]=1
done < File1
# Now ${prefixes[002379]} is 1, and ${prefixes[005964]} is 1, but
# ${prefixes[anything-else]} is undefined.
然后检查File2
每行的前六个字符,看看它是否在这个关联数组中:
while read word do ;
prefix="${word:0:6}"
if [[ "${prefixes[$prefix]}" ]] ; then
echo "$word"
fi
done < File2