unix 如何使用grep或awk,使用一个文件来填充另一个文件中缺少的信息?

ih99xse1  于 2022-11-03  发布在  Unix
关注(0)|答案(3)|浏览(135)

我有两个.tsv文件,第一个文件比另一个文件长很多。第二个文件作为与第一个文件中的标记相关联的值的索引。我如何将第二个文件中的信息填充到第一个文件中?我想我可以使用grep或awk,但我很难理解,因为我是一个初学者。任何帮助都是非常感谢的!
文件1

item_1
item_1
item_2
item_3
item_4
item_4

文件2

item_1    12    1002839    1231232
item_2    13    1006323    1621313
item_3    11    1052636    1931233
item_4     9    1024249    1631315

期望结果

item_1    12    1002839    1231232
item_1    12    1002839    1231232
item_2    13    1006323    1621313
item_3    11    1052636    1931233
item_4     9    1024249    1631315
item_4     9    1024249    1631315
hxzsmxv2

hxzsmxv21#

join实用程序对指定的文件执行 * 相等联接 *,并将结果写入标准输出。

join file1.tsv file2.tsv
kb5ga3dv

kb5ga3dv2#

基于awk的解决方案,

  • 无需对文件进行预排序
  • file-2在整个产品线范围内执行重复数据消除

|

{m,n,g}awk 'NF = NR==FNR ? _*++__[$+_] : __[substr($+_, !_, match($+_, 
                 ".[ \t]"))]*+(__[$+_]++<NF)-(OFS="\n" $-_)' FS='^$' file1 file2

item_1    12    1002839    1231232
item_1    12    1002839    1231232
item_2    13    1006323    1621313
item_3    11    1052636    1931233
item_4     9    1024249    1631315
item_4     9    1024249    1631315

它的行为有点类似于SQLx 1 m3n1x语句INNER JOINs,但不必完全相同::
--返回non-de-duped file1deduped-file2的笛卡尔积("DD2"),在两者的$1上连接,即使$1DD2中不是唯一的

e.g. what "uniq -c" looked like after I randomized it, 
     plus altering value of last column in some of them :

           2 item_1 12 1002839 1231231
           2 item_1 12 1002839 1231232
           1 item_2 13 1006323 1621312
           1 item_2 13 1006323 1621313
           1 item_3 11 1052636 1931232
           1 item_3 11 1052636 1931233
           2 item_4 9 1024249 1631314
           2 item_4 9 1024249 1631315
4ktjp1zp

4ktjp1zp3#


# print empty line if item does  not exist in file2.tsv

$ awk 'NR==FNR{a[$1]=$0; next}{$0=a[$1]}1' file2.tsv file1.tsv
item_1    12    1002839    1231232
item_1    12    1002839    1231232
item_2    13    1006323    1621313
item_3    11    1052636    1931233

item_4     9    1024249    1631315

item_4     9    1024249    1631315

# print only item if item does not exist in file2.tsv

$ awk 'NR==FNR{a[$1]=$0; next}{a[$1] ? $0=a[$1]: $0}1' file2.tsv file1.tsv
item_1    12    1002839    1231232
item_1    12    1002839    1231232
item_2    13    1006323    1621313
item_3    11    1052636    1931233
item_7
item_4     9    1024249    1631315
item_5
item_4     9    1024249    1631315

# skip line if item does not exist in file2.tsv

# $ awk 'NR==FNR{a[$1]=$0; next}{if(a[$1]){$0=a[$1]}else{next}}1' file2.tsv file1.tsv

item_1    12    1002839    1231232
item_1    12    1002839    1231232
item_2    13    1006323    1621313
item_3    11    1052636    1931233
item_4     9    1024249    1631315
item_4     9    1024249    1631315

相关问题