給定inputfile
Cherries:20:100:300
Beans:12:400:500
Tomatoes:32:445:234
Potatoes:24:400:200
Kiwis:23:230:435
我有一個 awk 腳本,名稱為testscript.script
:
BEGIN{ FS = ":"
print "------------------------"
}
if($3 + $4 > 500) {print $1, $2}
END{
print "------------------------"
}
呼叫此腳本時的輸出awk -f testscript.script inputfile
如下:
------------------------
Beans 12
Tomatoes 32
Potatoes 24
Kiwis 23
------------------------
我想按字母順序(按名稱)對該列表進行排序,然後將其儲存到變數中,以便可以在端區塊awk 腳本的。
即程式碼應該看起來像這樣。
BEGIN{ FS = ":"
print "------------------------"
}
*if($3 + $4 > 500) {print $1, $2 | "sort" = variable}
END{
print "------------------------"
print variable
}
該print variable
命令會產生
------------
------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32
將排序後的項目清單作為變量,並將其列印在虛線後面的 END 區塊中。
做這個的最好方式是什麼?
答案1
echo "---------------";awk -F: '$3+$4>500{print $1,$2}' inputfile |sort && echo "---------------"
使用 awk
awk -F: '$3+$4>500{Arr[$1]=$2}END{n=asorti(Arr,SArr);for(i=1;i<=n;i++){print SArr[i],Arr[SArr[i]]}}' inputfile
答案2
在考慮「最佳」方式時,需要考慮很多因素,我認為最佳是滿足我的需求的最快路線。如果您試圖傳遞超出進程範圍的變量,我建議將其通過管道傳輸到 ram 驅動器(幾乎所有發行版都有一個),然後處理您的測試,並在完成後從該 ramdisk 中匯出。
在基於 Debian 的發行版上,您會發現 ram 驅動器位於 /run/shm,因此類似的東西可能會滿足您的需求。
cat inputdata.file | sed 's/:/ /g' | awk '{print $1" "$2}' | sort -k 1,1 > /run/shm/datastore.file; echo '------------------------' > datastore2.file; cat /run/shm/datastore.file>>/run/shm/datastore2.file; cat /run/shm/datastore2.file>~/destination.file
當一個進程想要做某事的方式限制了你時,只需用邏輯和記憶體驅動器控制格式化即可。不要忘記在處理後移動數據,因為一旦重新啟動, /run/shm/* 中的任何內容都會被刪除。我希望這有幫助。我會密切關注,以防我誤解了您的需求。
答案3
你可以將整個事情放入 shell 腳本中sort
並在列印之前將 Awk 輸出透過管道傳輸。
假設您想要排序輸出上方和下方的行(這在視覺上對我來說更有意義):
#!/bin/sh
printf '%s\n' ------------------------
cat "$@" | awk -F: '($3 + $4 > 500) {print $1, $2}' | sort
printf '%s\n' ------------------------
myscript
將其保存在名為set toexecutable 的檔案中,並在inputfile
您透過呼叫指定的檔案上執行:
./myscript inputfile
輸出看起來像:
------------------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32
------------------------
請注意使用"$@"
,以便該腳本可以處理多個文件參數,而不僅僅是一個,就像 Awk 可以做到的那樣。
您也可以跳過使用cat
並執行以下操作:
awk -F: '($3 + $4 > 500) {print $1, $2}' "$@" | sort
但是,我個人不喜歡在需要的地方傳遞檔案名可以被解釋為代碼。所以我會用來cat
連接文件。