我有:
文件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)
两个sed
s 将最后一个字段移动到行首,例如
field1*field2*...field(N-1)*field(N)
变成
field(N)*field1*field2*...*field(N-1)
然后将结果sort
在1
st 场上进行 ed,然后在 st 场上join
进行 ed(始终在1
st 场上)。这将打印如下行:
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)