2013-03-08 70 views
1

如何輸出csv文件的第一個副本? 例如,如果我有:在csv文件中輸出第一個副本

00:0D:67:24:D7:25,1,-34,123,135 
00:0D:67:24:D7:25,1,-84,567,654 
00:0D:67:24:D7:26,1,-83,456,234 
00:0D:67:24:D7:26,1,-86,123,124 
00:0D:67:24:D7:2C,1,-56,245,134 
00:0D:67:24:D7:2C,1,-83,442,123 
00:18:E7:EB:BC:A9,5,-70,123,136 
00:18:E7:EB:BC:A9,5,-90,986,545 
00:22:A4:25:A8:F9,6,-81,124,234 
00:22:A4:25:A8:F9,6,-90,456,654 
64:0F:28:D9:6E:F9,1,-67,789,766 
64:0F:28:D9:6E:F9,1,-85,765,123 
74:9D:DC:CB:73:89,10,-70,253,777 

我希望我的輸出看起來像這樣:

00:0D:67:24:D7:25,1,-34,123,135 
00:0D:67:24:D7:26,1,-83,456,234 
00:0D:67:24:D7:2C,1,-56,245,134 
00:18:E7:EB:BC:A9,5,-70,123,136 
00:22:A4:25:A8:F9,6,-81,124,234 
64:0F:28:D9:6E:F9,1,-67,789,766 
74:9D:DC:CB:73:89,10,-70,253,777 

,我沿的第一輸出CSV文件的第一行,以便像awk (code that outputs first row) >> file.csv再行思考將該行的第一個字段與下一行的第一個字段進行比較,如果它們相同,則檢查下一行。直到涉及到一個新的行,代碼將再次輸出新的不同行,並且它會重複,直到檢查完成爲止

即時類型新的bash編碼,但我愛它到目前爲止,我目前的措辭一個csv文件,我需要一些幫助。謝謝大家

回答

1

如果我理解你你得到什麼想是這樣的:

prev_field="" 
while read line 
do 
    current_field=$(echo $line | cut -d ',' -f 1) 
    [[ $current_field != $prev_field ]] && echo $line 
    prev_field=$current_field 
done < "stuff.csv" 

哪裏stuff.csv是你的文件的名稱。這是假設你想要做的是採取在csv行的第一個字段,並只打印它的第一個獨特的事件,如果是這種情況,我認爲你的輸出可能會缺少一些。

+0

哦,yeh我錯過了一些,但這正是我需要的,也是如何,我會輸出這個新的編譯列表?即時通訊假設我不能在代碼中的任何位置粘貼> newStuff.csv – CrudeCoder 2013-03-08 02:35:52

+0

@ user2143205您可以簡單地運行該腳本並將輸出重定向到像'bash script.sh> newStuff.csv'這樣的文件。我傾向於這樣做,因爲它在數據結束的位置更靈活。換句話說,你可以做一些像'bash script.sh | grep「something」'和grep輸出。 – cwgem 2013-03-08 02:38:48

+0

好,沒關係,我在'done <「stuff.csv」'後面插入'> newStuff.csv'並且它工作正常。謝謝 – CrudeCoder 2013-03-08 02:39:05

4

使用AWK:其中第一列是鍵和值是不計

awk -F, '!a[$1]++' file.csv 

AWK形成的陣列。特定密鑰存在的次數。 '!a[$1]++'只有當第一列出現第一次出現時,第一次出現的行纔會被打印。

0
perl -F, -lane '$x{$F[0]}++;print if($x{$F[0]}==1)' your_file 

如果要更改文件就地:

perl -i -F, -lane '$x{$F[0]}++;print if($x{$F[0]}==1)' your_file 
1

使用的uniq:

sort lines.csv | uniq -w 17 

前提是你的第一列是固定大小(17)。 lines.csv是一個包含原始輸入的文件。

相關問題