我有一個具有以下格式的文件:
487422,Potenza
487386,Forlì-Cesena
487399,Grosseto
487425,Catanzaro
487409,Napoli
487446,Prato
495498,Fermo
487425,Catanzaro
487389,Macerata
487442,Biella
487351,Asti
487424,Cosenza
487404,Roma
487359,Como
487404,Roma
487401,Terni
487420,Brindisi
487397,Arezzo
487348,Vercelli
487382,Modena
487356,Genova
487365,Cremona
487369,Verona
487386,Forlì-Cesena
正如您所看到的,它是一個以逗號分隔且有重複項的文字。我想使用 來刪除與第 1 列相關的文字awk
。
命令列
如果我使用 shell 介面,這就是我得到的
487422,Potenza
487386,Forlì-Cesena
487399,Grosseto
487425,Catanzaro
487409,Napoli
487446,Prato
495498,Fermo
487389,Macerata
487442,Biella
487351,Asti
487424,Cosenza
487404,Roma
487359,Como
487401,Terni
487420,Brindisi
487397,Arezzo
487348,Vercelli
487382,Modena
487356,Genova
487365,Cremona
487369,Verona
這是我對以下命令的期望
awk -F"," '!a[$1]++' filename.csv
awk腳本
如果我使用 awk 腳本編寫如下
#!/bin/awk -f
BEGIN {
FS=","
}
{
{!a[$1]++}
}
我沒有得到任何輸出。是不是劇本有什麼問題?為什麼腳本和命令列之間的行為不同?
答案1
大括號外面!a[$1]++
是一個狀態{print}
,如果評估結果為真(非零),則會觸發預設操作。
大括號內{{!a[$1]++}}
是一個行動這是無條件評估的,沒有副作用。去掉大括號:
#!/bin/awk -f
BEGIN {
FS=","
}
!a[$1]++
答案2
@steeldriver 的 awk 答案是正確的,並且可能是您所需要的,但是如果您的輸入變得很大,它可能會耗盡內存和/或變得相對較慢,在這種情況下,這裡有一個將繼續工作的裝飾/排序/取消裝飾方法:
nl -w1 -s, file | # Decorate by prefixing with line numbers
sort -ut, -k2,2 | # Sort uniquely by the real key field
sort -nt, -k1,1 | # Sort whats left by the line numbers we added
cut -d, -f2- # Undecorate by removing the line numbers