34

マージする必要があるファイルが 100 個以上ありますが、ファイルごとに最初の行を削除する必要があります。Unixでこれを行う最も効率的な方法は何ですか? おそらくcatsed '1d'を使用したコマンドだと思います。すべてのファイルは同じ拡張子を持ち、同じフォルダーにあるため、おそらく *.extension を使用してファイルを指すことができます。どうもありがとう!

4

5 に答える 5

38

ファイル名がファイルを追加したい順序でソートされていると仮定すると、次を使用できます。

ls *.extension | xargs -n 1 tail -n +2

編集: SorinとGillesが、出力を配管することの潜在的な危険性についてコメントした後、次を使用できます。

find . -name "*.extension" | xargs -n 1 tail -n +2
于 2012-04-11T10:00:53.633 に答える
20

誰もが複雑でなければなりません。これは本当に簡単です:

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
于 2012-04-11T12:00:06.303 に答える
6

最初の行を削除した後、各ファイルを追加するだけです。

#!/bin/bash

DEST=/tmp/out
FILES=space separated list of files

echo "" >$DEST
for FILE in $FILES
do
    sed -e'1d' $FILE >>$DEST
done
于 2012-04-11T09:55:57.707 に答える
3

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
于 2012-04-11T11:27:06.147 に答える
2
ls -1 file*.txt | xargs nawk 'FNR!=1'
于 2012-04-11T11:36:42.523 に答える