동일한 확장자를 가진 여러 파일 패턴의 마지막 줄을 읽는 가장 빠른 방법

동일한 확장자를 가진 여러 파일 패턴의 마지막 줄을 읽는 가장 빠른 방법

/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라인에 하나만 있다고 가정하고 다음을 수행할 수 있습니다.=

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'

관련 정보