Linux

將上一個命令的輸出傳遞給下一個命令

  • July 25, 2019

我在下面有兩個 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如果您沒有重定向 , 的輸出cutxargs則會使用文件sort內容作為參數而不是文件名來執行。這不是您想要的(您想將cutas數據的輸出傳遞給sort)。

引用自:https://unix.stackexchange.com/questions/532168