答案How to use STDIN twice from pipe
是「你不能」。如果你想兩次使用stdin的數據,那麼當你第一次讀它時,你需要將它保存在某個地方,以便下次使用它。例如:
$ seq 3 |
awk '
BEGIN {
if (("mktemp"|getline line) > 0) tmp=line; else exit
ARGV[ARGC]=tmp; ARGC++
}
NR==FNR { print > tmp }
{ print FILENAME, NR, FNR, $0 }
' -
- 1 1 1
- 2 2 2
- 3 3 3
/var/folders/11/vlqr7jmn6jj3fglyl12lj0l00000gn/T/tmp.Y03l9pS7 4 1 1
/var/folders/11/vlqr7jmn6jj3fglyl12lj0l00000gn/T/tmp.Y03l9pS7 5 2 2
/var/folders/11/vlqr7jmn6jj3fglyl12lj0l00000gn/T/tmp.Y03l9pS7 6 3 3
或者您可以將它存儲在內部數組或字符串中,並在稍後從中讀取它。
說了這麼多,您的具體問題,並不需要任何特別的,只是一個簡單的:
cat *all_input | awk 'FNR==NR {col1[$1]; col2[$2]++; next} {print $0, col2[$2] "/" length(col1)}' - *all_input
會做,但除非你的文件是巨大的你真正需要的是商店,它-在 - 陣列辦法:
awk '{ col1[$1]; col2[$2]++; f0[NR]=$0; f2[NR]=$2 }
END {
for (nr=1; nr<=NR; nr++) {
print f0[nr], col2[f2[nr]] "/" length(col1)
}
}' *all_input
你的問題根本沒有意義。如果你正在通過stdin捕捉許多文件來awk?爲什麼你需要在結束時再次傳遞stdin。你有理解錯誤 – Inian
..你爲什麼在首先提出另一個要求後完全改變了這個問題? – Inian
對錯描述抱歉,但似乎|進入<(...),兩次完美無缺。腳本看起來:awk'FNR == NR {col1 [$ 1] ++; COL2 [$ 2] ++;接下來} {打印$ 0 COL2 [$ 2] 「/」 長度(COL1)} <(貓*文件)<(貓*文件) – Geroge