동시에 여러 텍스트에서 특정 줄을 가져오는 방법은 무엇입니까?

동시에 여러 텍스트에서 특정 줄을 가져오는 방법은 무엇입니까?

동일한 디렉토리에 text1.txt, text2.txt,..., text100.txt라는 100개의 텍스트가 있다고 가정합니다. 각 텍스트에서 특정 줄(처음 100줄)을 추출하고 이 줄을 또 다른 새로운 100줄의 텍스트에 별도로 저장하고 싶습니다.각각의 새 텍스트에는 100줄이 있습니다..

알아요 head -100 text1.txt > text1_new.txt... head -100 text2.txt > text2_new.txt할 수 있어요. 하지만 터미널에서 둘 다 추출하는 더 효율적인 방법이 있습니까?

감사해요! !

답변1

한 가지 방법은

find . -name "text*.txt" -type f -print0 | xargs -0 -I{} sh -c 'f="{}"; head -100 "$f" > "${f%.txt}_new.txt"'
  • find . -name "text*.txt" -type f디렉토리에서 모든 텍스트 파일 찾기
  • -print0공백을 보존하기 위해 널 문자로 파일 경로를 인쇄합니다.
  • xargs -0Null로 끝나는 매개변수를 허용합니다.
  • -I{}매개변수로 사용할 자리표시자
  • sh -c명령 문자열을 사용하여 대시 실행
  • f="{}"매개변수를 변수에 저장f
  • head -100 "$f"헤더 명령
  • "${f%.txt}_new.txt"매개변수의 ".txt"를 "_new.txt"로 바꿉니다.

답변2

파일을 반복할 수 있습니다.

for f in *.txt
do
    head -n100 "$f" > "${f%.txt}_new.txt"
done

일치하는 모든 파일을 나열하기 위해 도착 시 *.txt확장됩니다. 이 스크립트를 (부분적으로 또는 완전히) 실행한 경우 일부 결과 파일도 일치합니다. 해결책은 실행하기 전에 제거 rm *_new.txt하거나 ( ) 패턴을 조이는 것입니다.

답변3

"병렬성"을 원하면 다음을 사용하십시오.parallel

shopt -s extglob
parallel sh -c 'out="${1%.txt}_new.txt"; head -n 100 "$1" > "$out"' _ -- !(*_new).txt

나는 당신의 쉘이 bash라고 가정하고 사용합니다.확장 모드텍스트 파일을 통해 반복아니요*_new.txt

관련 정보