我知道一般的方法是使用類似的東西
$ sort file1.txt | uniq > file2.txt
但是我想知道是否有一種方法可以在不需要單獨的源檔案和目標檔案的情況下做到這一點,即使這意味著它不能是單行的。
uj5u.com熱心網友回復:
使用 Perl 的-i:
perl -i -lne 'print unless $seen{$_} ' original.file
-i“就地”更改檔案;-n逐行讀取輸入,運行每一行的代碼;-l從輸入中洗掉換行符并將它們添加到print;%seen哈希習語在perlfaq4中描述。
uj5u.com熱心網友回復:
使用 GNU awk 進行“就地”編輯:
awk -i inplace '!seen[$0] ' file1.txt
與所有支持“就地”編輯( , ,等)的工具(除了ed需要先將整個檔案讀入記憶體除外)一樣,它在幕后使用臨時檔案。sed -iperl -iruby -i
使用任何 awk,您都可以在不使用臨時檔案但使用大約兩倍記憶體的情況下執行以下操作:
awk '!seen[$0] {a[ n]=$0} END{for (i=1;i<=n;i ) print a[i] > FILENAME}' file
uj5u.com熱心網友回復:
一個常見的成語是:
temp=$(mktemp)
some_pipeline < original.file > "$temp" && mv "$temp" original.file
重要的&&是:如果管道失敗,那么原始檔案將不會被(也許)垃圾覆寫。
Linuxmoreutils軟體包包含一個將其封裝起來的程式:
some_pipeline < original.file | sponge original.file
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/471546.html
