
次のスクリプトを使用して名前が異なり、同じデータ構造を持つ28個のファイルをマージしたいと思います。
$ cp mohan.csv Consolidate.csv
$ for fname in line
do
cat $fname | sed '1d' >> Consolidate.csv
done < input.txt
そしてinput.txt
以下を含んでいます:
mohan.csv
babu.csv
mahesh.csv
datvik.csk
... etc
そして
$ cat mohan.csv
no,name,dept
1,xyz,hr
2,abc,sales
私のスクリプトの出力:
$ cat Consolidate.csv
no,name,dept
1,xyz,hr
2,abc,sales
babu.csv
mahesh.csv
datvik.csk
... etc
この問題について助けてください。
答え1
さまざまなツールを使用して作業を完了できます。最初のヘッダーを保持し、他のヘッダーを削除したいとします。したがって、他のファイルのヘッダーを削除しながら、変更されていない最初のファイルに追加するだけです。
削除する:mohan.csv
input.txt
$ cat input.txt
babu.csv
mahesh.csv
datvik.csk
... etc
それから:
$ cp mohan.csv consolidate.csv
$ for file in "$(<input.txt)"; do
sed '/no,name,dept/d' "$file" >> consolidate.csv
done
または以下を使用してread
:
$ cp mohan.csv consolidate.csv
$ while read -r file; do
sed '/no,name,dept/d' "$file" >> consolidate.csv
done < input.txt
あるいは、より簡単には、以下sed
で純粋な答えを見つけることができます。https://unix.stackexchange.com/a/204343/72707
答え2
どうですか?
awk 'NR==1 || FNR > 1' $(< input.txt )
awk
コマンドラインからファイル名のリスト(LINE_MAXシステム設定パラメータまで)を生成するように「コマンドの置き換え」を引用しないでください。ファイル名に空白文字が含まれている場合は、配列に戻ります。
readarray -t Arr < input.txt
awk 'NR==1 || FNR > 1' "${Arr[@]}"
タイトルが複数行にわたっている場合は、スクリプトで比較したい2つの数字を調整してくださいawk
。
答え3
この解決策は、ファイルのリストが一部の外部コマンドへの単一の呼び出しが処理できるよりも長くなる可能性があることを前提としています(したがって、input.txt
ファイル名をコマンドラインに一度にリストすることはできません)。
場所パラメータリスト(たとえば、一部のスクリプトのパラメータリスト)に接続するファイルのパス名のリストが含まれていて、出力ファイルがまだ存在しない場合は、その最初のファイルのヘッダーのみを取得したいとします。 。出力ファイルがすでに存在する場合は、ヘッダーがすでに出力に書き込まれていると想定できます。
シェルでこれを行う最小コードは次のとおりです。
[ ! -e outfile ] && head -n 1 -- "$1" >outfile
awk 'FNR != 1' "$@" >>outfile
ここでは、ファイルがまだ存在しない場合は、最初のhead -n 1
ファイルからのみヘッダーを取得して書き込むために使用されます。次に、すべてのファイルから最初の行を除くすべての行を抽出し、その行を 。outfile
outfile
awk
outfile
この小さなスクリプトは、ファイル名が適切に引用されているか、それ以外の場合は「単純」(空白文字や引用符が含まれていない)と見なし、ファイル内のinput.txt
すべての入力ファイルに対して実行できます。input.txt
xargs sh -c '
out=$1; shift
[ ! -e "$out" ] && head -n 1 -- "$1" >"$out"
awk "FNR != 1" "$@" >>"$out"
' sh Consolidate.csv <input.txt
これは、入力をパラメータとして使用するxargs
小さなインラインスクリプトを実行するために使用されます。出力ファイル名は最初の引数として提供され、インラインスクリプトとして受け取ります。sh -c
input.txt
Consolidate.csv
out
リストが長いinput.txt
場合、xargs
インラインスクリプトが複数回呼び出されるようにスケジュールされ、バッチパラメータがファイルから読み込まれます。