Shell-Script
使用 xargs 和 sed 將第一行從一個文件複製到其他文件
我有一個拆分 CSV 文件的列表。如何將第一個 CSV 標頭複製到其餘的 CSV 文件中?
profiles00.csv profiles01.csv profiles02.csv profiles03.csv ...
這就是我現在所擁有的,但是如何將輸出發送到新文件或替換現有文件?
find . -name \*.csv -print0 | xargs -0 -I {} -P 100 sed -e '1r {}' -e 'q' profiles00.csv
這是處理您的特定問題的一種方法:
find . -maxdepth 1 -type f -name "profiles*.csv" ! -name "profiles00.csv" -exec sed -i -e '1!b' -e 'R profiles00.csv' -e 'N' {} +
以多行方式編寫,如下所示:
find . -maxdepth 1 \ -type f \ -name "profiles*.csv" ! -name "profiles00.csv" \ -exec sed -i -e '1!b' \ -e 'R profiles00.csv' \ -e 'N' \ {} +
讀作:查找實用程序應
-maxdepth 1
=> 只在目前目錄中行走,通常它會一直遞歸到最低層次。
-type f
=> 走路時只選擇正常文件。
-name "profiles*.csv" ! -name "profiles00.csv"
=> 在所有正常文件中,僅選擇以profiles*.csv 作為其基本名稱的人並過濾掉“profiles00.csv”文件,因為這是標頭檔。
-exec sed -i -e '1!b' -e 'R profiles00.csv' -e 'N' {} +
-i
選項 => 就地編輯文件 假定 GNU sed
-e
選項 => sed 程式碼如下
1!b
=> 不要觸摸非第一行。R profiles00.csv
=> 從profiles00.csv 文件中讀取一行(因為這是第一次,所以它將是第一行)。所以基本上標題是從profiles00.csv文件中提取出來的。但還沒有列印出來。N
=> 將下一行讀入模式空間。這會清除讀取緩衝區,然後從 sed 正在操作的目前文件中清除實際模式空間(第 1,2 行)。
{} +
將使find一舉將其選擇的多個文件提供給該sed
實用程序,並且GNU sed能夠使用該-i
選項處理多個文件。具體來說,為讀入的新文件重置行號。≠================ Posix方式======
LC_ALL=C \ find . ! -name . -prune -type f \ -name 'profiles??*.csv' \ ! -name 'profiles*[!0-9]*.csv' \ ! -name 'profiles00.csv' \ -exec sh -c ' shift "$1" head -n 1 < profiles00.csv > header for arg do printf "0r header\\nw\\nq\\n" | ed -s "$arg" done ' 2 1 {} +
在這裡,我們放棄了 sed 並求助於 ed。
- 0r => 將提到的文件的內容插入到 ed 正在編輯的文件的開頭。
- w => 將寫入文件,從而凍結所有所做的更改。
- q => 將退出 ed 編輯器。