使用匹配的条目(shell脚本)

时间:2017-09-13 22:54:22

标签: shell awk

我有两个结构相同的.csv文件

ENSTGUG00000000001,C2CD2L
ENSTGUG00000000002,DPAGT1
ENSTGUG00000000003,EGR1
ENSTGUG00000000004,REEP2
ENSTGUG00000000005,
ENSTGUG00000000006,PIAS2
ENSTGUG00000000007,KDM3B
ENSTGUG00000000008,
ENSTGUG00000000010,HMBS
ENSTGUG00000000011,

ENSTGUG00000000001,
ENSTGUG00000000002,DPAGT1
ENSTGUG00000000003,EGR1
ENSTGUG00000000004,REEP2
ENSTGUG00000000005,
ENSTGUG00000000006,PIAS2
ENSTGUG00000000007,KDM3B
ENSTGUG00000000008,LOC100218573
ENSTGUG00000000010,HMBS
ENSTGUG00000000011,

我想在第一个文件的第一列中找到第二列为空的元素,并在第二个文件的第二列中搜索相应的元素。

这样输出就是

ENSTGUG00000000001,C2CD2L
ENSTGUG00000000002,DPAGT1
ENSTGUG00000000003,EGR1
ENSTGUG00000000004,REEP2
ENSTGUG00000000005,
ENSTGUG00000000006,PIAS2
ENSTGUG00000000007,KDM3B
ENSTGUG00000000008,LOC100218573
ENSTGUG00000000010,HMBS
ENSTGUG00000000011,

这样我可以让第一个文件尽可能完整。

2 个答案:

答案 0 :(得分:1)

假设您的文件逐行排列:

awk '{getline s < "file2.csv"; split( s, a, ",")} 
      !$2 && a[2] { $2 = a[2] }1' FS=, file1.csv

这甚至不是很强大,如果你的文件不完全匹配将完全没有价值,但它给你一个起点。

这是相当不言自明的...... awk本质上一次读取一行输入文件。每次读取一行时,它都会执行脚本中的命令。在这种情况下,它从file2.csv中读取一行并将其拆分为,。然后它检查从file1.csv读取的行的第二个字段是否为布尔值为false(因此,如果您有整数0的条目,它们可能会被覆盖)并且该行中的第二个字段来自文件2不为零。如果这是真的,它会将file2中的字段分配给当前输入行的第二个字段。然后它输出该行。

答案 1 :(得分:0)

awk oneliner:

$ $ awk 'BEGIN{FS=OFS=","} NR==FNR{if($2!="")a[$1]=$2;next}{if($2=="")$2=a[$1]}1' input2.txt input1.txt
ENSTGUG00000000001,C2CD2L
ENSTGUG00000000002,DPAGT1
ENSTGUG00000000003,EGR1
ENSTGUG00000000004,REEP2
ENSTGUG00000000005,
ENSTGUG00000000006,PIAS2
ENSTGUG00000000007,KDM3B
ENSTGUG00000000008,LOC100218573
ENSTGUG00000000010,HMBS
ENSTGUG00000000011,

说明:

BEGIN{FS=OFS=","}     # set field-separator and output field-seperator to a ","

NR==FNR{              # for the first input file
  if ($2!="")         # if $2 is not an empty string
     a[$1]=$2;        # save $2 in array a with index $1
  next                # skip to next line to read
} 
{ 
  if ($2=="")         # if $2 is empty string
     $2=a[$1]         # replace it with the save value in array a
}1