여러 파일의 문자열이 포함된 줄을 파일 순서대로 가져오는 방법은 무엇입니까?

여러 파일의 문자열이 포함된 줄을 파일 순서대로 가져오는 방법은 무엇입니까?

이전 질문과 관련이 있습니다 ...

5000개 파일의 첫 번째 열에 특정 문자열이 있는 행을 가져오고 싶습니다. 하지만 출력 파일의 줄을 입력 파일 순서대로 표시하고 싶습니다. 예를 들어,

파일 1

agd fkg fls  ofk
ggs kkg ikg  gkl
bsg ksf olg  lzj
many more lines,,,
kgf kkg ikg  lgk

파일_2

gik zlg olg  pzk
ppl sjg gol  dzj
zjg iwj bmh  hgi
many more lines,,,
kgf wlg ugk  lkf

더 많은 파일이 있습니다..

결과물 파일

kgf kkg ikg lgk  -- This line from the File_1
kgf wlg ugk lkf  -- This is from the File_2
more lines...
kgf ald fig wdg  -- This last line is from the File_5000 

아래와 같이 여러 파일에서 한 줄을 얻으십시오.

grep -rEh `kgf` File_* > Output_file

하지만 이렇게 하면 output_file은 행을 무작위 순서로 표시합니다. 출력 파일의 첫 번째 줄은 File_1 대신 File_20 또는 다른 파일에서 나올 수 있습니다. 그래서 나는 output_file이 File_1의 라인을 출력 파일의 첫 번째 라인으로 표시하고, File_2를 출력 파일의 두 번째 라인으로, File_3을 출력 파일의 세 번째 라인으로 표시하기를 원합니다.

이거 아는 사람 있나요?

미리 감사드립니다!

답변1

확장 순서는 File_*무작위가 아닙니다. 쉘 와일드카드는 쉘에 따라 strcmp()(바이트 대 바이트 비교) 또는 (사용자의 로케일 조합)을 사용하여 파일 이름을 어휘적으로 정렬합니다.strcoll()

File_10어차피 올 거란 뜻이야앞으로 File_2.

숫자 순서의 경우 zsh쉘을 사용하여 다음을 수행할 수 있습니다.

grep -h '^kgf' File_*(n) > Output_file

glob 한정자는 해당 glob (또 다른 특정 기능) n만 확장하는 옵션을 엽니다 .numericglobsortzsh

GNU 시스템( -h사용 중인 옵션은 이미 GNU 확장임)을 사용 중이고 쉘을 사용하는 경우 다음과 같이 할 수 있습니다.

printf '%s\0' File_* | sort -zV | xargs -r0 grep -h '^kgf' > Output_file

sort -V하나는 어디에 있습니까?버전zshsort는 s 처럼 동작합니다 .숫자글로벌 정렬.

관련 정보