2014-07-22 44 views
1

我有多個文件(* .csv)具有相應值(「值#」)的公共列(「Common_Title」)我需要將它們合併成一個彙總文件。合併多個文件:第一列(相同字符串),第二列(每個文件的唯一值)

一個困難的部分是我需要所有的值傳遞到摘要文件,但單個文件有時缺少某個「Common_Title」,因此需要在其「Value#」位置放置一個「0000」。

這是3個示例文件,都有點不同

# File1.csv 

Common_Title,Value1 
AAAAA,1111 
BBBBB,1111 
CCCCC,1111 

# File2.csv 

Common_Title,Value2 
AAAAA,2222 
BBBBB,2222 
DDDDD,2222 
EEEEE,2222 

# File3.csv 

Common_Title,Value3 
AAAAA,3333 
BBBBB,3333 
CCCCC,3333 
EEEEE,3333 

我想合併到本摘要文件

# MergedFiles123.csv 

Common_Title,Value1,Value2,Value3 
AAAAA,1111,2222,3333 
BBBBB,1111,2222,3333 
CCCCC,1111,0000,3333 
DDDDD,0000,2222,0000 
EEEEE,0000,2222,3333 

回答

1

用awk其中:

awk -F, '!a[$1]++ { keys[++i] = $1 } !r[FILENAME]++ { ++argind } { b[$1, argind] = $2 } END { for (i = 1; i in keys; ++i) { k = keys[i]; t = k; for (j = 1; j <= argind; ++j) t = t FS (length(b[k, j]) ? b[k, j] : "0000"); print t } }' file1 file2 file3 

輸出:

Common_Title,Value1,Value2,Value3 
AAAAA,1111,2222,3333 
BBBBB,1111,2222,3333 
CCCCC,1111,0000,3333 
DDDDD,0000,2222,0000 
EEEEE,0000,2222,3333 

評論:

  • !a[$1]++ { keys[++i] = $1 }隨着病情!a[$1]++,塊({})時,第一次遇到$1只能評估。在塊內部,密鑰($1)被添加到keys陣列一次。
  • !r[FILENAME]++ { ++argind }每次遇到新文件時遞增計數器argind
  • { b[$1, argind] = $2 }參照key和當前文件索引argind存儲數據。
  • END { for (i = 1; i in keys; ++i) { k = keys[i]; t = k; for (j = 1; j <= argind; ++j) t = t FS (length(b[k, j]) ? b[k, j] : "0000"); print t } }'處理所有文件後運行。它依次遍歷keys中的每個密鑰;並打印所有基於該密鑰的數據作爲從b[]獲取的單行,幷包含對索引的引用。
+0

這合併所有類似的「Common_Title」,但沒有超過我仍然需要的其他人。爲了做出完整的總結,我希望每個'Value#'列在摘要文件中都是唯一的。在我的例子中,我認爲把「0000」放在文件缺失的位置可能會有用。 – BlacquenedRed

+0

需要明確的是,這是其比MergedFiles123.csv(以上)不同的輸出:Common_Title,值1,值,值3 AAAAA,1111,2222,3333 BBBBB,1111,2222,3333 CCCCC,1111,3333 – BlacquenedRed

+0

@BlacquenedRed你有沒有嘗試過最新的更新? – konsolebox

相關問題