以下には、ヘッダーが同じでベクトルが異なる複数のファイルがあります。すべて接続する必要がありますが、最初のファイルのヘッダーのみを接続し、他のヘッダーはすべて同じであるため、接続したくありません。
例: 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
上記の「」に似た別のソリューションは、head
GNUtail
または互換を使用します。
最初のファイルのヘッダーを出力に書き込みます。
head -n 2 file1.txt > all.txt
head -n 2
- ファイルの最初の2行を取得します。すべてのファイルの内容を追加します。
tail -n +3 -q file*.txt >> all.txt
- 3行目から最後まで印刷します。 GNUは複数のファイル名を引数(標準の共通拡張子)として使用することができます
-n +3
(GNU拡張子、FreeBSD、およびNetBSDでもサポートされています)、ヘッダーを印刷しないように指示します。ファイル名(read)を使用してファイルを上書きするのではなく、ファイルに追加します。tail
tail
-q
man
>>
>
もちろん、次の2つのコマンドを1行に入力することもできます。
head -n 2 file1.txt > all.txt; tail -n +3 -q file*.txt >> all.txt
またはそれらの間に成功確認を;
置く代わりに。&&
Shell glob 拡張はデフォルトで語彙順にソートされます。つまり、file1.txt
to はfile9.txt
数値順に並べ替えられますが、ロケールに応じておよび間 (またはロケールに応じてその前にも) に並べ替えfile10.txt
られます。使用する場合は、数値ソートに使用されます。file1.txt
file2.txt
file1.txt
zsh
file*.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
ノート
:
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。