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}' '{}' +