2013-10-24 67 views
0

如果我有3個csv文件,並且我想將所有數據合併爲一個,但彼此相鄰,我該怎麼做?例如:如何在csv文件中彼此相鄰添加數據

初始合併文件:

,,,,,,,,,,,, 

文件1:

20,09/05,5694 
20,09/06,3234 
20,09/08,2342 

文件2:

20,09/05,2341 
20,09/06,2334 
20,09/09,342 

文件3:

20,09/05,1231 
20,09/08,3452 
20,09/10,2345 
20,09/11,372 

最終合併文件:

09/05,5694,,,09/05,2341,,,09/05,1231 
09/06,3234,,,09/06,2334,,,09/08,3452 
09/08,2342,,,09/09,342,,,09/10,2345 
,,,,,,,,09/11,372 

從每個文件的基本數據進入合併後的文件的特定列。 我知道awk函數可以用於此,但我不知道如何開始

編輯:只有第二和第三列的每個文件正在打印。我用這個打印出來的第二和第三列:

awk -v f="${i}" -F, 'match ($0,f) { print $2","$3 }' file3.csv > d$i.csv 

然而,比方說,文件1和文件2是該行空,該行的數據將被轉移到左邊。所以我想出了這個佔移位:

awk -v x="${i}" -F, 'match ($0,x) { if ($2='/NULL') { print "," }; else { print $2","$3}; }' alld.csv > d$i.csv 

回答

3

使用GNU AWK爲ARGIND:

$ gawk '{ a[FNR,ARGIND]=$0; maxFnr=(FNR>maxFnr?FNR:maxFnr) } 
    END { 
     for (i=1;i<=maxFnr;i++) { 
      for (j=1;j<ARGC;j++) 
       printf "%s%s", (j==1?"":",,,"), (a[i,j]?a[i,j]:",") 
      print "" 
     } 
    } 
' file1 file2 file3 
09/05,5694,,,09/05,2341,,,09/05,1231 
09/06,3234,,,09/06,2334,,,09/08,3452 
09/08,2342,,,09/09,342,,,09/10,2345 
,,,,,,,,09/11,372 

如果你沒有GNU awk的,再加上一點說FNR==1{ARGIND++}初始行。

每個請求

註釋版本:

$ gawk ' 
    { a[FNR,ARGIND]=$0; # Store the current line in a 2-D array `a` indexed by 
         # the current line number `FNR` and file number `ARGIND`. 

     maxFnr=(FNR>maxFnr?FNR:maxFnr) # save the max FNR value 
    } 
    END{ 
     for (i=1;i<=maxFnr;i++) { # Loop from 1 to max number of fields 
            # seen across all files and for each: 
      for (j=1;j<ARGC;j++)  # Loop from 1 to total number of files parsed and: 
       printf "%s%s",   # Print 2 strings, specifically: 
        (j==1?"":",,,"),  # A field separator - empty if were printing 
             # the first field, three commas otherwise. 
        (a[i,j]?a[i,j]:",") # The value stored in the array if it was 
             # present in the files, a comma otherwise. 
      print ""     # Print a newline 
     } 
    } 
' file1 file2 file3 

我最初使用數組fnr[FNR]跟蹤FNR的最大值,但恕我直言,這是有點模糊,它也有缺陷,其中如果沒有線有,比如說,一個第二字段,然後在END部分的for (i=1;i in fnr;i++)環路將在進入第三個字段之前退出。

+0

是的!這工作,謝謝你..請你解釋一下嗎?我理解嵌套循環,但是術語是什麼意思,到底發生了什麼? – user2883071

+1

我把它清理了一下,並添加了一個註釋版本。如果這樣做你想要的,記得點擊它旁邊的複選標記,這樣別人不會浪費時間也試圖解決它 –

+0

不幸的是,我不是很熟悉這種語言 - 一般來說,什麼是「:」和「?」意思? – user2883071

3

paste是爲完成這件事:

$ paste -d";" f1 f2 f3 | sed 's/;/,,,/g' 
09/05,5694,,,09/05,2341,,,09/05,1231 
09/06,3234,,,09/06,2334,,,09/08,3452 
09/08,2342,,,09/09,342,,,09/10,2345 
,,,,,,09/11,372 

注意,paste光靠輸出只是一個逗號:

$ paste -d, f1 f2 f3 
09/05,5694,09/05,2341,09/05,1231 
09/06,3234,09/06,2334,09/08,3452 
09/08,2342,09/09,342,09/10,2345 
,,09/11,372 

所以要有多個我們可以使用另一個分隔符,如;,然後用,,,替換爲sed:

$ paste -d";" f1 f2 f3 | sed 's/;/,,,/g' 
09/05,5694,,,09/05,2341,,,09/05,1231 
09/06,3234,,,09/06,2334,,,09/08,3452 
09/08,2342,,,09/09,342,,,09/10,2345 
,,,,,,09/11,372 
+0

簡單可愛的解決方案,** + 1 ** – Birei

+0

這對大多數人來說是有效的。然而,當我嘗試將它合併到我的程序中,它並不完全工作(我不知道這是否是一個新的線程或不是因爲它們相關,但.. ..)我的csv有3列,我只打印出第二和第三列,我能夠實現這一點,但是當一個文件中的列爲空(比下一個文件中的列早)時,它會混淆整個格式...我想出了這個。但它給出了一個錯誤: awk -v x =「$ {i}」-F,'match($ 0,x){if($ 2 ='/ NULL'){print「,」};其他{print $ 2「,」$ 3}; }'all.csv> ul $ i.csv – user2883071

+0

@ user2883071請使用示例輸入更新您的問題,以便我可以改進解決方案。另請注意,這可能會有所幫助:http://unix.stackexchange.com/questions/16443/combine-text-files-column-wise – fedorqui

2

使用pr

$ pr -mts',,,' file[1-3] 
09/05,5694,,,09/05,2341,,,09/05,1231 
09/06,3234,,,09/06,2334,,,09/08,3452 
09/08,2342,,,09/09,342,,,09/10,2345 
,,,,,,09/11,372