將命令的輸出透過管道傳輸到 awk 腳本主體中的變數

將命令的輸出透過管道傳輸到 awk 腳本主體中的變數

給定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連接文件。

相關內容