将文本附加到另一个文件的现有制表符分隔文件中的列

时间:2012-10-09 23:05:50

标签: bash

在一个制表符分隔的文件中,它采用以下形式:

ID |整数|整数

1   12345    56789
2   11111    233323
3   43423    789798

基本上,file1.txt是制表符分隔的文件,其中第一列是编号为1-50的sql数据库的主键。其他两列只是与我们的数据集对应的数字。

然后在另一个文件中我有: 字符串|整数

c1  234234
c10 2342 
c11 5234
c2  987987
c3  234234

在file2.txt中,ID是一个字符串,其中数字是file1.txt中的相应ID。我想将file2.txt中的整数数据附加到file1.txt 我希望输出

1   12345    56789    234234
2   11111    233323   987987
3   43423    789798   234234

由于最初在file2数据库中创建数据的方式,字符串是ID。因此,当我们订购它时,它是c1,c10,c11,c12 ...... c2,c20,c21,c22 ....等。我想将数字与第一个文件对齐并附加数据。我怎样才能做到这一点?我非常喜欢bash,只有在我的专栏已完美排列时才找到粘贴命令。感谢。

1 个答案:

答案 0 :(得分:1)

使用GNU awk的一种方式:

awk 'BEGIN { FS=OFS="\t" } FNR==NR { array[substr($1, 2)]=$2; next } { if ($1 in array) print $0, array[$1] }' file2.txt file1.txt

结果:

1   12345   56789   234234
2   11111   233323  987987
3   43423   789798  234234

编辑:

file2.txt中的字符串可能包含许多非数字字符。如果是这种情况,请尝试以下方法:

awk 'BEGIN { FS=OFS="\t" } FNR==NR { gsub(/[^0-9]+/, "", $1); array[$1]=$2; next } { if ($1 in array) print $0, array[$1] }' file2.txt file1.txt

结果:

1   12345   56789   234234
2   11111   233323  987987
3   43423   789798  234234