ノート

ノート

以下には、ヘッダーが同じでベクトルが異なる複数のファイルがあります。すべて接続する必要がありますが、最初のファイルのヘッダーのみを接続し、他のヘッダーはすべて同じであるため、接続したくありません。

例: file1.txt

<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B 
C

ファイル2.txt

<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
D
E 
F

出力が必要です。

<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B
C
D
E 
F

Rでスクリプトを書くことはできますが、それをシェルで使用する必要がありますか?

答え1

cat+grep上記の「」に似た別のソリューションは、headGNUtailまたは互換を使用します。

  1. 最初のファイルのヘッダーを出力に書き込みます。

    head -n 2 file1.txt > all.txt
    

    head -n 2- ファイルの最初の2行を取得します。

  2. すべてのファイルの内容を追加します。

    tail -n +3 -q file*.txt >> all.txt
    

    - 3行目から最後まで印刷します。 GNUは複数のファイル名を引数(標準の共通拡張子)として使用することができます-n +3(GNU拡張子、FreeBSD、およびNetBSDでもサポートされています)、ヘッダーを印刷しないように指示します。ファイル名(read)を使用してファイルを上書きするのではなく、ファイルに追加します。tailtail-qman>>>

もちろん、次の2つのコマンドを1行に入力することもできます。

head -n 2 file1.txt > all.txt; tail -n +3 -q file*.txt >> all.txt

またはそれらの間に成功確認を;置く代わりに。&&

Shell glob 拡張はデフォルトで語彙順にソートされます。つまり、file1.txtto はfile9.txt数値順に並べ替えられますが、ロケールに応じておよび間 (またはロケールに応じてその前にも) に並べ替えfile10.txtられます。使用する場合は、数値ソートに使用されます。file1.txtfile2.txtfile1.txtzshfile*.txt(n)

答え2

Rで行う方法がわかっている場合は、必ずRで実行してください。クラシックUnixツールの場合、これはawkで最も自然に行われます。

awk '
    FNR==1 && NR!=1 { while (/^<header>/) getline; }
    1 {print}
' file*.txt >all.txt

awkスクリプトの最初の行は、FNR==1すべてのファイルの最初の行()以外のファイルの最初の行(NR==1)と一致します。これらの条件が満たされると、式が実行され、while (/^<header>/) getline;awkは現在の行がregexpと一致する限り、他の行を読み続けます(現在の行をスキップ)^<header>。 awkスクリプトの2行目は、前にスキップした行を除くすべての項目を印刷します。

答え3

この試み:

$ cat file1.txt; grep -v "^<header" file2.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B 
C
D
E 
F

ノート

  • この-vフラグは一致を反転するという意味です。
  • ^存在する正規表現、方法文字列の始まり
  • ファイルが多い場合はこれを行うことができます

:

array=( files*.txt )
{ cat ${array[@]:0:1}; grep -v "^<header" ${array[@]:1}; } > new_file.txt

それアレイスライシング技術。

答え4

array=( *.txt );head -1 ${array[0]} > all.txt; tail -n +2 -q ${array[@]:0} >> all.txt

ヘッダーが同じで結合/接続が必要な.txtファイルを含むフォルダを使用していると仮定すると、このコードはtxtファイルをすべてすべて.txtヘッダーは1つだけです。最初の行(セミコロンで区切られた行)は接続するすべてのテキストファイルを収集し、2行目は最初のtxtファイルのヘッダーを出力します。すべて.txt、最後の行はヘッダーなしで収集されたすべてのテキストファイルを連結し(2行目から連結)すべて.txt

関連情報