web-dev-qa-db-ja.com

複数のファイルから特定の行を印刷する

5000以上のファイルのコレクションがあり、すべてのファイルの27行目とそのファイル名を含むoutput.txtファイルを作成したいだけです。インターネットから得たものは、awkまたはsedコマンドを使用して、単一のファイルから特定の行を選択することです。たとえば、$sed -n 27p *.txt >>output.txt

たとえば、ディレクトリ内のファイルは次のとおりです。

log_1.txt
log_2.txt
log_3.txt
log_4.txt
.
.
.

新しいoutput.txtファイルの印刷された行の前または後ろにファイル名を含む各ファイルの27行目が必要です。

4
Ravi Saini
 awk 'FNR==27 {print FILENAME, $0}' *.txt >output.txt
  • FILENAMEは、現在の入力ファイル名の組み込みawk変数です
  • FNR現在のファイルの行番号を参照
  • $0は行全体を意味します
14
frams

別の可能性は:

for i in * ; do echo -n $i" : "  ; head -n 27 "$i" | tail -n 1 ; done > output.txt
3
mazs

forループの使用:

{ for i in *.txt; do echo "$i : $(sed -n '27p' "$i")"; done ;} >output.txt

forループは5000以上のファイルがあるので負荷がかかる可能性がありますが、現在のハードウェアでは問題になりません。


より高速な方法、27行目以降のsedの終了(thanks @Fiximan)

{ for i in *.txt; do echo "$i : $(sed -n '27p;q' "$i")"; done ;} >output.txt
3
heemayl

単純なawkの使用法:

awk 'FNR==27 {print FILENAME,$0}' /path/to/files/log_*.txt > outfile.txt
0
Sild