读取具有相同扩展名的多个文件模式中最后一行的最快方法

读取具有相同扩展名的多个文件模式中最后一行的最快方法

我在一个目录中有/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

使用and 假设线路上gawk只有一个,你可以这样做:=

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

更新

刚刚意识到我误读了这个问题,我认为您要查找的行始终是最后一行。要使用以frames=,开头的最后一行for gawkdo:

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 (可能也是大多数tartrGNU sed

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

相关内容