同じ拡張子を持つ複数のファイルパターンの最後の行を読み取る最速の方法

同じ拡張子を持つ複数のファイルパターンの最後の行を読み取る最速の方法

/home/files/同じ拡張子を持つディレクトリにいくつかのファイルがあります.txt

例えば

1.txt
2.txt
3.txt
4.txt
5.txt
test.txt

これらのファイルはすべて同じデータ型を持ちますが、データは異なります。これらのファイルには、少なくとも次の行が含まれています。

frames=[number here]

frames=この行はファイルに複数回表示されるため、ファイルに表示される最後の値を取得する必要があります。

私が言ったように、私は拡張子が.txtと一致するディレクトリにある上記のすべてのファイルからその行を取得したいと思います(再帰は必要ありません)。

これを行うことができる単一のbashコマンドはありますか?

編集する

予想出力:

1.txt=5000
2.txt=123
3.txt=3452
4.txt=111
5.txt=958
test.txt=1231

答え1

find+によってgrep

find . -name '*.txt' -exec sh -c 'grep -HPo "frames=\K.*" "$0" | tail -n1' {} \;

同様にShell forLoop+を使用してください。grep

for file in *.txt; do grep -HPo 'frames=\K.*' "$file" | tail -n1; done

答え2

gawk行に1つしかないとし、次のことができます。=

gawk -F= 'ENDFILE { print FILENAME"="$2 }' *.txt

修正する

私は質問を間違って読んだことに気づきました。探している行が常に最後の行であると思いました。frames=for で始まる最後の行を使用するには、gawk次のようにします。

gawk -F= '/^frames=/ { frames=$2 } ENDFILE { print FILENAME"="frames }' *.txt

または次のようにawk

for file in *.txt; do
  awk -F= '/^frames=/ { frames=$2 } END { print FILENAME"="frames }' "$file"
done

答え3

あなたはこれを行うことができますawk

awk -F= '/^frame/{line=FILENAME "=" $2}NR!=1 && FNR==1{print line}END{print line}' *.txt

またはsed(GNUバージョン4.2.2以降)を使用してください。

sed -sn '/^frame/{s///;h};${F;x;p}' *.txt | sed 'N;s/\n//'

答え4

そしてpax (おそらく大多数tarそしてtrGNU sed

pax -w ./*txt | 
tr -s \\0     | 
sed -nz '/txt$/h
         /\n*.*frames\(=[0-9]*\).*\n/!d
    H;x;s//\1/p'

関連情報