2015-11-02 46 views
0

我正在調查Sed或Awk來弄清楚這一點,但我完全迷失了。沒有起點。 我有一堆這些文件,所以我想使用分隔符(,)和使用索引/數組來複制一個值並替換另一個索引/數組。如何從下面的下一行拷貝數值

0001,324434344,Sterner,Erik B,B.A,1987 
0002,324434344,Sterner,Erik B,M.A,2001,Columbia University 

由於array [6]在第一行是空的。我想將第二行的數組[6]複製到第一行。我對如何查看文件以及確定數組[6]是否爲空有一個很好的想法,但是我只是不知道如何複製第二行數組[6]並將它替換爲之前的行。任何提示? 結果應該是:

0001,324434344,Sterner,Erik B,B.A,1987,Columbia University 
0002,324434344,Sterner,Erik B,M.A,2001,Columbia University 
+0

這是什麼字段分隔符? 「哥倫比亞大學」似乎在第8個逗號左右之後。另外,它只是關於這兩條線或者不同的東西?您可能必須在'awk'中兩次遍歷文件:一次存儲數據,然後打印它 – fedorqui

+0

分隔符是逗號(,)和查找數組[6]時的錯誤。讓我修復。 – Jim

+0

這裏的唯一身份證是什麼?第一場? – fedorqui

回答

6

倒行!然後,應該很簡單地存儲第六個字段的最新非空白值並在找到空白值時插入它。完成後再次反轉線條。

tac file.csv | perl -F, -alne ' 
    $last = $F[6] if $F[6]; 
    $F[6] ||= $last if $last; 
    print join ",", @F; 
' | tac 

可以使用tail -r而不是tac如果你在BSD衍生。

+0

謝謝我給了這一槍。 – Jim

+0

聖摩爾,這工作像完美。這比我需要的更多,並且適合我的項目。謝謝! – Jim

+0

非常歡迎!很高興幫助。 – mwp

2

如果我們假設該ID存儲在第二列,比如,你可以說:

$ awk 'BEGIN{FS=OFS=","} FNR==NR {a[$2]=$NF; next} NF<7{$(NF+1)=a[$2]}1' file file 
0001,324434344,Sterner,Erik B,B.A,1987,Columbia University 
0002,324434344,Sterner,Erik B,M.A,2001,Columbia University 

這讀取文件兩次:第一次來存儲數據,然後將打印它。

在第一次迭代時,它會填充數組data[2nd field] = last field。然後,在第二次迭代時,如果該行包含少於7列,則會添加該字段。

+0

即時消息在我的終端中出現'$:command not found'錯誤 – Jim

+0

您不必複製'$',它只是我的提示,我複製並顯示輸出。 – fedorqui

+1

啊,菜鳥錯誤,錯過了那個哈哈。謝謝工作就像一個魅力!我很感激。 – Jim