Shell-Script

使用 xargs 和 sed 將第一行從一個文件複製到其他文件

  • May 18, 2018

我有一個拆分 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 編輯器。

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