output.txt
私は5000を超えるファイルコレクションを持っており、すべてのファイルとそのファイル名の27行目を含むファイルを作成したいと思います。私がインターネットから得たのは、awk
orsed
コマンドを使用して単一のファイルから特定の行を選択することです。たとえば、次のようになります。
$sed -n 27p *.txt >>output.txt
たとえば、ディレクトリ内の私のファイルは次のようになります。
log_1.txt
log_2.txt
log_3.txt
log_4.txt
.
.
.
私は各ファイルの行27とそのファイル名が新しいファイルの印刷された行の前後にあることを望みますoutput.txt
。
答え1
awk 'FNR==27 {print FILENAME, $0}' *.txt >output.txt
FILENAME
現在の入力ファイル名の組み込み awk 変数です。FNR
現在のファイルの行番号を参照します。$0
全体の行を表します。
答え2
別の可能性は次のとおりです。
for i in * ; do echo -n $i" : " ; head -n 27 "$i" | tail -n 1 ; done > output.txt
答え3
for
ループを使用してください。
{ for i in *.txt; do echo "$i : $(sed -n '27p' "$i")"; done ;} >output.txt
5000を超えるファイルがあるため、屋根のfor
費用がかかりますが、現在のハードウェアを考慮すると問題になりません。
より速い方法、sed
27号線以降の出口(@Fiximanに感謝):
{ for i in *.txt; do echo "$i : $(sed -n '27p;q' "$i")"; done ;} >output.txt
答え4
簡単なawkの使い方:
awk 'FNR==27 {print FILENAME,$0}' /path/to/files/log_*.txt > outfile.txt