分割された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エディタを終了します。
答え2
xargsは必要ありません
注文する:
find . -maxdepth 1 ! -name "profiles00.csv" -a -name "*csv" -exec sed -i "1s/^/$(head -1 profiles00.csv)\n/" {} \;
find
ここでは、ファイルを選択してsed
その場所で編集するために使用します。
説明する
find
maxdepth 1
- サブディレクトリのファイルではなく、直接ディレクトリのファイルのみを選択します。サブディレクトリのファイルも編集するには、このオプションを削除できます。! -name "profiles00.csv" -a -name "*csv"
- すべてのcsvファイルを選択しますが、profile00.csvは選択しないでください。ここではそうでは-a
ありません。!
sed
-i
- ファイルを所定の位置に編集1
-行のアドレス指定s/^/$(head -1 profiles00.csv)\n/
- ファイルの先頭を指定されたテキストに置き換えます。
head
-1
- 最初の行を選択してください。
答え3
これはテストされていない擬似コードスケッチなので、うまくいかないかもしれませんが、次のようにします(ファイルを上書きしないように最初にファイルをバックアップしてください)。
sed -i '1s/^/'`head -n1 profiles00.csv`'/' *.csv
ファイルの挿入に関する追加情報:
https://stackoverflow.com/questions/9533679/how-to-insert-a-text-at-the-beginning-of-a-file