findコマンドを使用してサブフォルダのテキストファイルから行を抽出する

findコマンドを使用してサブフォルダのテキストファイルから行を抽出する

input.txtという名前の100個のサブフォルダのそれぞれにテキストファイルがありますsample_1, ..., sample_100

input.txt以下を使用して、すべてのファイルの最初の行を抽出できます。

find -name input.txt -exec awk 'FNR == 1 {print $0}' > out.txt {} \;

input.txtただし、これは現在のディレクトリ内のファイルのすべての最初の行を印刷しますout.txt

私が望むのは、各サブフォルダ内の対応する特定のサブフォルダout.txtの最初の行です。input.txtたとえば、out.txt内部sample_57サブフォルダの最初の行input.txtはですsample_57

これを達成する方法のアイデア。

答え1

head代わりに使用してくださいawk。また、代わりに-execdir-exec実行したいコマンドを読みやすくします。

find -type f -name input.txt -execdir sh -c 'head -1 input.txt > out.txt' \;

答え2

out.txt各サブフォルダの最初の行input.txt

find+sed解決策:

find . -type f -name input.txt -exec sh -c 'out_fn="${1%/*}/out.txt"; sed -n "1p" "{}" > "$out_fn"' _ {} \;
  • out_fn="${1%/*}/out.txt"- 道出力ファイル名滞在/path/to/subfolder/out.txt

  • sed -n "1p" "{}"- 入力ファイルから最初の行を抽出します。{}

答え3

ただ

find . -type f -name "input.txt" -execdir awk 'NR==1{print $0>"out.txt"}' '{}' +

exitまたは、最初の行を印刷した後に終了するハンドラを使用することができます。最初の行だけをawk印刷し、ファイルの最後までファイル全体を処理する必要がない場合は、これをお勧めします。

find . -type f -execdir awk '{print $0>"out.txt";exit}' '{}' +

関連情報