我有一个看起来像这样的文件
文件1
3 123456789
3 00000
2 123456789
2 abcde
1
4 abcdefgh
第一列中的行与另一个文件的行号相关,如下所示:
文件2
$a&a(md
( l 0 p a$1
=2 3 x5 x4
&a”s?m!a
我想要某种方法来融合文件,将第一个文件第一列中的数字替换为第二个文件相应行的内容。所以最终的文件看起来像这样:
输出
=2 3 x5 x4 123456789
=2 3 x5 x4 00000
( l 0 p a$1 123456789
( l 0 p a$1 abcde
$a&a(md
&a”s?m!a abcdefgh
格式并不重要,只要我能分辨出哪一列是哪一列即可。
我正在使用Linux。
任何帮助是极大的赞赏。
答案1
您可以使用awk
,从 file2 构造一个按其行(记录)号索引的数组,然后根据 file1 的第一个字段进行查找
$ awk 'NR==FNR {a[FNR]=$0;next} {printf "%s\t%s\n", a[$1], $2}' file2 file1
=2 3 x5 x4 123456789
=2 3 x5 x4 00000
( l 0 p a$1 123456789
( l 0 p a$1 abcde
$a&a(md
&a”s?m!a abcdefgh
此制表符分隔两部分:如果您愿意,可以用逗号分隔它们。
答案2
您可以使用该join
命令来实现此目的。它基于公共字段合并两个文件。这是一个使用的示例bash
(为了便于阅读,我断了行):
join -t , \
<(awk '{ print NR","$0; }' file2.txt | sort -k 1b,1 -t ,) \
<(awk '{ print $1","$2; }' file1.txt | sort -k 1b,1 -t ,) \
| cut -d , -f 2- \
| column -t -s ,
输出:
( l 0 p a$1 123456789
( l 0 p a$1 abcde
=2 3 x5 x4 00000
=2 3 x5 x4 123456789
&a”s?m!a abcdefgh
一些解释:
- 为了简化字段和列的处理方式,第一步是标准化分隔符。这里,
,
用的是这个意思。 awk
用于标准化file1.txt
分隔符。- 由于
file2.txt
没有显式字段来连接行,awk
因此用于将行号添加到每行。 - 默认情况下,
join
使用每个文件的第一个字段来连接文件。因此无需指定应使用哪个字段。请注意,-t
给出的 表示字段由 分隔,
。 join
期望两个输入文件都已排序,因此sort
用于确保join
使用预期的默认排序。<( some_command )
创建匿名命名管道。它基本上允许我们将命令输出用作文件。cut
用于从输出中删除行号字段。- 最后,
column
用于将输出格式化为表格 (-t
)。为了避免弄乱来自 的数据file2.txt
,,
使用 , 用作分隔符 (-s ,
)。