我有两个结构相同的.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,
这样我可以让第一个文件尽可能完整。
答案 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