給定一個名稱數量未指定的檔案,如何在不知道要搜索的名稱的情況下計算每個名稱出現在檔案中的次數?
是的,逗號之間笨拙的名稱間距是檔案標準預期格式的一部分。
Sample_Names.txt :
Adam, Bob ,Billy, Cassandra ,Cally , Catherine, George
Amanda, Bob , Cassandra , Harry, Julie
Adam, Bob ,Billy, Harry, Larry
我目前在這個命令的配置中:
awk -F , '{for(i=1; i <= NF; i ) grep $i | wc -l;}' Sample_Names.txt
這將回傳:
awk: line 1: syntax error at or near wc
命令或 Shell 腳本的成功執行應回傳一個如下所示的檔案:
Adam 2
Amanda 1
Billy 2
Bob 3
Cally 1
Cassandra 2
Catherine 1
George 1
Harry 2
Julie 1
Larry 1
或類似的東西
uj5u.com熱心網友回復:
使用 awk,-F ,將欄位分隔符單獨設定為逗號,但您仍然需要空格。
如果你想從 awk 運行 shell 命令,你需要system().
但這不是必需的,您可以使用純 awk:
awk -F '[[:space:],] ' '
{
for (i=1; i<=NF; i ) {
names[$i]
}
}
END {
for (i in names) {
print names[i]"\t"i
}
}'
您可以通過管道將其傳輸sort -rnk 1,1到按頻率排序。
如果你有grep -o,還有:
grep -Eo '[[:alpha:]] ' | sort | uniq -c | sort -rn -k1,1
這不適ü用于某些語言環境中的非 ascii 字符(例如LC_ALL=POSIX, LANG=C)。它將在這些字符上拆分名稱。
您可以改為使用分隔符進行拆分,例如 awk,它更靈活:
grep -Eo '[^[:space:],] ' | sort | uniq -c | sort -rn -k1,1
uj5u.com熱心網友回復:
使用 GNU 工具:
tr -s ',' '\n' < example.txt | sed 's/^[ ]*//; s/[ ]*$//' | sort | uniq -c
2 Adam
1 Amanda
2 Billy
3 Bob
1 Cally
2 Cassandra
1 Catherine
1 George
2 Harry
1 Julie
1 Larry
解釋:
tr -s ',' '\n' < example.txt <- 用換行符替換所有逗號
sed 's/^[ ]*//; s/[ ]*$//' <- 洗掉每個名稱前后的任何空格
sort | uniq -c <- 對名稱進行排序,然后計算每個名稱的出現次數
——
如果需要,您還可以使用 awk 對輸出重新排序,例如
tr -s ',' '\n' < example.txt | sed 's/^[ ]*//; s/[ ]*$//' | sort | uniq -c | awk '{print $2, $1}'
Adam 2
Amanda 1
Billy 2
Bob 3
Cally 1
Cassandra 2
Catherine 1
George 1
Harry 2
Julie 1
Larry 1
uj5u.com熱心網友回復:
我認為您不需要為此使用 awk,嘗試簡單地將-o 指令添加到 for 回圈中的 grep 命令。那應該找到每個字串匹配并每行輸出匹配 1,wc 可以輕松處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/360649.html
