이전 질문과 관련이 있습니다 ...
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
만 확장하는 옵션을 엽니다 .numericglobsort
zsh
GNU 시스템( -h
사용 중인 옵션은 이미 GNU 확장임)을 사용 중이고 쉘을 사용하는 경우 다음과 같이 할 수 있습니다.
printf '%s\0' File_* | sort -zV | xargs -r0 grep -h '^kgf' > Output_file
sort -V
하나는 어디에 있습니까?버전zsh
sort는 s 처럼 동작합니다 .숫자글로벌 정렬.