xargsとsedを使用してあるファイルの最初の行を別のファイルにコピーする

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

ベストアンサー1

特定の問題を処理する1つの方法は次のとおりです。

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"=>すべての一般ファイルの中で、デフォルト名がプロファイル* .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=>profile00.csvファイルから1行を読み込みます。 (最初のため最初の行になります。)したがって、デフォルトではヘッダーはprofile00.csvファイルから抽出されます。しかし、まだ印刷されていません。

    • N=>次の行をパターン空間に読み込みます。これは読み取りバッファをフラッシュし、sedが動作している現在のファイルから実際のパターンスペースをフラッシュします(ライン1、2)。

  • {} +すること探す選択した複数のファイルを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が編集しているファイルの先頭に挿入します。
  • 勝つ=>ファイルに書き込み、すべての変更を凍結します。
  • キュー=> edエディタを終了します。

おすすめ記事