find 및 sed를 사용하여 여러 파일의 20번째 줄을 하나로 복사

find 및 sed를 사용하여 여러 파일의 20번째 줄을 하나로 복사

라는 파일이 있습니다PKA1

이 폴더에는 다음과 같은 이름의 여러 폴더가 있습니다.

1eV, 2eV....30eV

각 하위 폴더에는 다음과 같은 파일이 있습니다.PKA.dump

PKA.dump각 하위 폴더의 20행을 이름이 지정된 폴더로 복사하고 싶습니다 data.txt.

find 명령을 사용하여 모든 파일을 찾을 수 있다는 것을 알고 있습니다 PKA.dump.

find . -type f -name PKA.dump

나는 또한 혼자서 글을 쓸 수 있다는 것을 알고 있습니다 sed.

sed -i '20q;d' PKA.dump > data.txt

그러나 모든 파일을 반복하여 예를 들어 사용하려고 하면 sed다음과 같습니다.

find . -type f -name PKA.dump | sed -i '20q;d' PKA.dump > data.txt

다음 오류가 발생합니다.

sed: can't read PKA.dump: No such file or directory

도움이 필요하세요? PKA.dump파일 1eV2eV의 20행을 순차적으로 3eV이름이 지정된 파일 에 넣고 싶습니다 data.txt.

답변1

find . -name PKA.dump -type f -exec awk '
   FNR == 20 {print; nextfile}' {} +

nextfile, 사용 가능한 경우(GNU awk 및 FreeBSD와 최신 버전 mawk곧 표준에 추가될 예정) 다음 파일로 이동합니다. 그렇지 않은 경우 무시됩니다(변수 역참조와 마찬가지로 nextfile). 여전히 작동하지만 파일 전체를 읽습니다.

여전히 다음을 수행할 수 있습니다.

find . -name PKA.dump -type f -exec sed '20q;d' {} \;

그러나 이는 sed파일당 하나의 명령을 실행하는 것을 의미하므로 효율성이 떨어집니다.

관련 정보