将 file1 中的数字替换为 file2 中的相应行

将 file1 中的数字替换为 file2 中的相应行

我有一个看起来像这样的文件

文件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 ,)。

相关内容