マージする必要があるファイルが 100 個以上ありますが、ファイルごとに最初の行を削除する必要があります。Unixでこれを行う最も効率的な方法は何ですか? おそらくcatとsed '1d'を使用したコマンドだと思います。すべてのファイルは同じ拡張子を持ち、同じフォルダーにあるため、おそらく *.extension を使用してファイルを指すことができます。どうもありがとう!
5 に答える
ファイル名がファイルを追加したい順序でソートされていると仮定すると、次を使用できます。
ls *.extension | xargs -n 1 tail -n +2
編集: SorinとGillesが、出力を配管することの潜在的な危険性についてコメントした後、次を使用できます。
find . -name "*.extension" | xargs -n 1 tail -n +2
誰もが複雑でなければなりません。これは本当に簡単です:
tail -q -n +2 file1 file2 file3
等々。多数のファイルがある場合は、最初にそれらを配列にロードできます。
list=(file1 file2 file3)
tail -q -n +2 "${list[@]}"
現在のディレクトリ内の特定の拡張子を持つすべてのファイル?
list=(*.extension)
tail -q -n +2 "${list[@]}"
あるいは単に
tail -q -n +2 *.extension
最初の行を削除した後、各ファイルを追加するだけです。
#!/bin/bash
DEST=/tmp/out
FILES=space separated list of files
echo "" >$DEST
for FILE in $FILES
do
sed -e'1d' $FILE >>$DEST
done
tail
ファイルの最後の行を出力します。印刷する行数、または最初に省略する行数を指定できます (-n +N
ここで、N は、印刷する最初の行の番号で、1 から数えて、1 行を+2
省略します)。GNU ユーティリティ (つまり、Linux または Cygwin の下)、FreeBSD、または-q
オプションを持つその他のシステム:
tail -q -n +2 *.extension
tail
各ファイルの前にヘッダーを出力しますが、-q
これは標準ではありません。実装にそれがない場合、または移植可能にする場合は、ファイルを反復処理する必要があります。
for x in *.extension; do tail -n +2 <"$x"; done
または、各ファイルの最初の行を識別する方法を持つ Awk を呼び出すこともできます。これは、小さなファイルが多数ある場合は高速になり、大きなファイルが多数ある場合は遅くなる可能性があります。
awk 'FNR != 1' *.extension
ls -1 file*.txt | xargs nawk 'FNR!=1'