它通常是更簡單,更有效的做到既迭代和處理在AWK,而不是試圖通過在AWK的外殼和處理迭代劃分任務。 AWK很適合迭代輸入,並且它也有自己的循環結構(例如for
)。如果可能,請在AWK中進行所有處理。
這就是說,你的問題似乎也需要訪問shell中的輸入字段,所以在你的情況下AWK中的完整處理可能是不可能的。 (值得一提的是,AWK也可以執行shell命令,但是這可能是複雜的只是一個級別。)
其他答案用AWK通過文件和打印的東西2列4迭代,像
$ awk '{print "My friend", $2, "lives in", $4}' MyFile
這很好,如果你可以迭代和處理這樣的AWK。作爲除了這種類型的解決方案,你可能想跳過第一行(這似乎有列標題,而不是實際的數據)
$ awk 'NR>1{print "My friend", $2, "lives in", $4}' MyFile
您的評論
其實我治療比印刷更復雜一點。我需要在「for」循環中進行一些測試和分配。
表明你真正想要的是訪問你的shell中的字段。您可以通過使用AWK挑出來的領域(如前),但配管的值入殼得到這樣的:
awk 'NR>1{print $2,$4}' MyFile | while read user livesIn; do
echo "My friend $user lives in $livesIn"
done
這讓你在shell $user
和$livesIn
,所以你可以做更復雜的殼處理它。例如:
awk 'NR>1{print $2,$4}' MyFile | while read user livesIn; do
if [[ "$user" == "John" ]]; then
echo "$user is not my friend, but lives in $livesIn"
else
echo "My friend $user lives in $livesIn"
echo "$user" >> friends.txt
fi
done
由於AWK在空白區域分裂,所以要小心輸入文件的格式。
來源
2016-02-01 21:12:57
e0k
此外,awk通過並排放置字符串來實現字符串連接:'print $ 2 $ 4'不會用空格分隔字段。你想要'打印$ 2,$ 4'(它隱式使用OFS)或明確地'打印$ 2''$ 4' –