2017-02-23 83 views
-1

這樣做的最佳方式是什麼?CSV - 如何基於現有列添加列?

我收集的東西叫sed,AWKbash可能是相關的。 我已經用AWK一次爲一個命令,其他人從來沒有。 我已經搜索和其他顯然類似的問題沒有我需要的答案。

我有一個CSV文件,我已經叫fields列:

_________________________ 
field1 | field2 | field3| 
------------------------- 
1990AB | 123456 | 123456| 
------------------------- 

我想基於這三個原始fields顯示爲增加fields如下:

_______________________________________________________ 
field1 | field2 | field3 | field1a | field2a | field3a | 
------------------------------------------------------- 
1990AB | 123456 | 123456| 1990 | 12345 | 12345 | 
------------------------------------------------------- 

其中:

  • field1a 1990第1欄第4位總是數字然後阿爾法
  • field2a 12345第2欄是始終6位數字
  • field3a 12345第3欄是始終6位數字

這些都是一次性每個文件的動作,數據庫導入之前。

macosx有約600萬條記錄。第一次嘗試這個問題顯然不是很好。在這方面我是一個100%新手。

+3

您的文件模式管道是用數據之間的空格分隔的嗎?您的標題和充滿破折號的數據之間是否有額外的記錄?如果不是,你可以分享你的文件看起來像什麼(前幾個記錄),確切地說你想要的輸出是什麼? – JNevill

+1

此外,對於你想要的輸出,你只是想要'field'的前4個字符,'field2'和'field3'的前5個字符在你的記錄中顯示爲新的字段?或者在這裏應用了其他一些邏輯,例如'field4'只是'field1'的數字部分,'field5'和'field6'是'field2'和'field3'除以10並舍入到最接近的整數。 – JNevill

+0

管道空間和下劃線和破折號是爲了讓我相信我應該使用如果我希望得到答案的情況下,stackoverflow的首選演示文稿。這是一個以逗號分隔的文件,所以field1,field2,fieldn,...和yes都有一個標題row1。我假設「文件模式」意味着它是如何佈局的。我會編輯這個問題來回答你的其他問題。謝謝。 – Anthony500

回答

1

awk來救援!

這應該是易於閱讀,即使你有awk

$ awk -F, -v OFS=, 'NR==1 {for(i=1;i<=3;i++) $(++NF)=$i"a"}  
        NR>1 {$(++NF)=substr($1,1,4); 
          $(++NF)=substr($2,1,5); 
          $(++NF)=substr($3,1,5)}1' file  

NR沒有現成的經驗是行號,頭特殊處理,NF是字段數,這裏增加了每增加一柱和$i是位置i的字段值。最後的1是打印該行的簡寫。初始選項用於將輸入字段分隔符(F)和輸出字段分隔符(OFS)設置爲逗號。

+0

這會在給定一些CSV輸入文件時完全破壞輸出,並添加其他人只有0的領域,還有其他的副作用。不知道這是值得發佈的答案,直到我們看到什麼輸入看起來像是一半時間,當人們說他們的輸入是CSV沒有一個逗號在眼前,它是標籤或分號或別的東西分開,我們沒有如果這些字段在引號之內,或者可以包含逗號,甚至可以交叉線等等。對於閱讀此內容的任何人,不要假設它適用於一種CSV格式,它將適用於您的特定格式。 –

+0

這裏說-v設置一個變量,但我看不到你設置了一個,那工作怎麼樣?你有++來增加這個神祕的變量嗎? – Anthony500

+0

變量集是輸出字段分隔符,隱含在print語句中(這裏是'1')。 'NF'是字段的數量,每當我們添加一個新列時,它就會遞增並且新字段被設置。答案中的解釋不夠清楚嗎? – karakfa