/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 for
Loop+を使用してください。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
)そしてtr
GNU sed
:
pax -w ./*txt |
tr -s \\0 |
sed -nz '/txt$/h
/\n*.*frames\(=[0-9]*\).*\n/!d
H;x;s//\1/p'