最初のファイルのヘッダーのみを保持しながら、同じ構造のファイルをリンクします。

最初のファイルのヘッダーのみを保持しながら、同じ構造のファイルをリンクします。

次のスクリプトを使用して名前が異なり、同じデータ構造を持つ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.csvinput.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ファイルからのみヘッダーを取得して書き込むために使用されます。次に、すべてのファイルから最初の行を除くすべての行を抽出し、その行を 。outfileoutfileawkoutfile

この小さなスクリプトは、ファイル名が適切に引用されているか、それ以外の場合は「単純」(空白文字や引用符が含まれていない)と見なし、ファイル内の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 -cinput.txtConsolidate.csvout

リストが長いinput.txt場合、xargsインラインスクリプトが複数回呼び出されるようにスケジュールされ、バッチパラメータがファイルから読み込まれます。

関連情報