2017-09-13 56 views
0

我有相同結構的兩個.csv檔案來使用匹配的條目(shell腳本)

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, 

我想找到的第一個文件的第1列元素爲其第二列爲空,並在第二個文件的第二列中查找相應的內容。

,使輸出將

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

這樣我可以有第一檔儘可能完整。

+4

你嘗試過這麼遠嗎? (通常情況下,如果某人表現出某種努力,就會在SO上得到更好的迴應。) – John1024

回答

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中的字段分配給當前輸入行的第二個字段。然後輸出該行。

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 
+0

您需要'awk'BEGIN {FS = OFS =「,」} ...' – RomanPerekhrest

+0

@RomanPerekhrest號。命令行有一個-F,其中設置了FS。這裏不需要OFS。 –

+0

錯誤,請再次查看問題 – RomanPerekhrest