我有這個檔案(空格分隔):
bc1 no 12
bc1 no 15
bc1 yes 4
bc2 no 8
bc3 yes 14
bc3 yes 12
bc4 no 2
我想得到這個輸出:
bc1 3 no;no;yes 31
bc2 1 no 8
bc3 2 yes;yes 26
bc4 1 no 2
第一列:輸入檔案中第一列的一次出現
2nd:輸入檔案中出現的次數
3rd :用“;”翻譯成行的第 3 列 分隔符
4th:最后一列的總和
我可以用“否/是”列做我想做的事:
awk -F' ' 'NF>2{a[$1] = a[$1]";"$2}END{for(i in a){print i" "a[i]}}' test.txt | sort -k1,1n
uj5u.com熱心網友回復:
另一種awk想法:
awk '
function print_row() {
if (series)
print key,c,series,sum
c=sum=0
series=sep=""
}
{ if ($1 != key) # if 1st column has changed then print previous data set
print_row()
key=$1
c
series=series sep $2
sep=";"
sum =$3
}
END { print_row() } # flush last data set to stdout
' input
這會產生:
bc1 3 no;no;yes 31
bc2 1 no 8
bc3 2 yes;yes 26
bc4 1 no 2
uj5u.com熱心網友回復:
這是使用datamash和的解決方案awk:
$ datamash -t' ' -g1 collapse 2 sum 3 <ip.txt
bc1 no,no,yes 31
bc2 no 8
bc3 yes,yes 26
bc4 no 2
$ <ip.txt datamash -t' ' -g1 collapse 2 sum 3 | awk '{c=gsub(/,/, ";", $2); $2 = c 1 " " $2} 1'
bc1 3 no;no;yes 31
bc2 1 no 8
bc3 2 yes;yes 26
bc4 1 no 2
datamash -t' ' -g1 collapse 2 sum 3使用空格作為欄位分隔符。通過使用第 1 列作為鍵來折疊第 2 列。sum 3有助于找到總數。
然后,awk用于將,第二列更改為;(datamash據我所知,沒有選項可以指定折疊分隔符),然后根據需要顯示結果。
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。由于 $1(first column) 總是排序的,我們不需要對它進行排序,所以在這里提出這個解決方案。
awk '
prev!=$1 && prev{
print prev OFS count,value,sum
count=sum=0
prev=value=""
}
{
prev=$1
value=(value?value ";":"") $2
count
sum =$NF
}
END{
if(prev){
print prev OFS count,value,sum
}
}
' Input_file
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/518150.html
標籤:linuxawk
