Linux
將上一個命令的輸出傳遞給下一個命令
我在下面有兩個 for 循環,它們將最終輸出創建為排序文件,但我只想合併到一個 for 循環中
for i in *.txt; do cut -f 5,10 $i >$i.txt.out done ###sorting for i in *.txt.out; do sort -k1,1 $i >$i.sort done
我嘗試通過使用管道重定向第一個 for 循環的輸出來將兩個循環合併為一個循環。我嘗試了這篇文章中的一種方法(將上一個命令的輸出作為參數傳遞給下一個),但無法獲得所需的結果。
for i in *.txt; do cut -f 5,10 $i >$i.txt.out | xargs -I{} sort -k1,1 {} >$i.sort done
有什麼建議麼?
謝謝
羅恩
for name in *.txt; do cut -f 5,10 -- "$name" | sort -k 1,1 >"$name.sort" done
這將結合兩個初始循環的效果,同時擺脫對中間文件的使用。
我做了一些小的修改:
- 引用所有變數的擴展,因為什麼時候需要雙引號?
- 為循環變數使用更好的名稱。
- 從
cut
命令中分隔變數--
以表示選項結束,以防文件名以$name
破折號開頭。也可以使用
sort -k 1,1 -o "$name.sort"
代替sort
上面的命令,讓sort
實用程序創建輸出文件而不是 shell(細微差別)。該
xargs
實用程序通常用於代替循環:printf '%s\n' *.txt | xargs -I {} sh -c 'cut -f 5,10 -- "$1" | sort -k 1,1 >"$1.sort"' sh "{}"
…但在這裡它只會讓事情變得更複雜(上面的命令在處理包含換行符的文件名時會出現問題)。
你的命令
cut -f 5,10 $i >$i.txt.out | xargs -I{} sort -k1,1 {} >$i.sort
會做
cut
並將輸出保存到$i.txt.out
($i
擴展)。由於被重定向到文件的輸出,該xargs
命令將沒有輸入。cut
如果您沒有重定向 , 的輸出cut
,xargs
則會使用文件sort
的內容作為參數而不是文件名來執行。這不是您想要的(您想將cut
as數據的輸出傳遞給sort
)。