Bash脚本用于比较具有不同长度字符串的2个文件

时间:2014-12-30 21:21:31

标签: string bash for-loop

我有两个文件,我试图逐行比较每个字符串。 File1仅包含6个字符的字符串前缀,而File2包含12个字符的字符串。如何遍历File2以查找以File1中的6个字符开头的字符串并将其输出到文件中?

File1中

002379
005964

文件2

002379ED6212
003354EB4591
004679BB2185
005964AB3379
005964DB5496

4 个答案:

答案 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