按字母数字模式加入(大)文件

按字母数字模式加入(大)文件

我有:

文件1如:

sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters*ALPHANUMERIC_PATTERN

文件2如:

sting_of_printable_characters*ALPHANUMERIC_PATTERN

其中*是字段分隔符,字母数字模式始终是行中的最后一个字段。
我完全不知道如何实现以下目标,并希望得到一些帮助。

我基本上需要“加入”(我已经尝试过该join命令,但它似乎不适用于字母数字键)这两个基于“ALPHANUMERIC_PATTERN”的文件,并且仅在两个文件包含相同的 ALPHANUMERIC_PATTERN 的情况下打印。

我更愿意使用它,awk因为它的处理效率很高,但任何事情都会非常有帮助。 (这些文件很大。)

问题是我需要看到类似于以下内容的输出:

ALPHANUMERIC_PATTERN*stuff_from_file_1*stuff_from_file_2

答案1

join可以尝试这样:

join -t\* \
<(sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file1 | sort -t\* -k1,1) \
<(sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file2 | sort -t\* -k1,1)

两个seds 将最后一个字段移动到行首,例如

field1*field2*...field(N-1)*field(N)

变成

field(N)*field1*field2*...*field(N-1)

然后将结果sort1st 场上进行 ed,然后在 st 场上join进行 ed(始终在1st 场上)。这将打印如下行:

field(N)*fields(1)to(N-1)*from*file1*fields(1)to(N-1)*from*file2 

如果您喜欢使用临时文件并将join结果保存到例如outfile

sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file1 | sort -t\* -k1,1 > sorted_1
sed 's/\(.*\)\(\*\)\(.*\)/\3\2\1/' file2 | sort -t\* -k1,1 > sorted_2
join -t\* sorted_{1,2} > outfile
rm -f sorted_{1,2}

答案2

只要字段数量固定,就可以直接加入最后一个字段:

join -t \* -1 4 -2 2 file1 file2
ALPHANUMERIC_PATTERN*sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters

当然,这两个字段都需要根据您想要加入它们的字段进行排序。如果没有,你可以使用 don_crissti 展示的技术

joint -t \* -1 4 -2 2 <(sort -k4 file1) <(sort -k2 file2)

相关内容