약 120개의 파일이 있고 각 파일은 1000줄이 넘습니다.
각 행에는 자체 키가 있습니다. 열은 |분리되어 있습니다.
다음은 행의 예입니다. 키 열(열 11은 항상 열 11임)은 다음과 같습니다.2010\07\05\ITE854075_RECardProtectionlogi.msg
오류: Null, 데이터: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|국가를 알 수 없음
일치하는 키/11번째 열 값이 있는 모든 행을 찾는 방법이 있습니까(전체 행이 일치하지 않음)? 명령줄이나 스크립트에서 이 작업을 수행할 수 있나요? 나는 cygwin을 사용할 것이다.
어떻게 시작해야 할지조차 모르니, 찾을 수 있도록 적절한 명령만 주시면 감사하겠습니다.
각 행에는 자체 키가 있으므로 행 수만큼 키가 있을 수 있습니다.
나는 스크립트가 전체 디렉토리에서 실행되고 추가 사용자 입력 없이 모든 파일의 중복 키를 보고하기를 원합니다.
키를 정의하는 열 11입니다.
답변1
"키"가 "열"을 참조한다고 가정하면 다음과 같이 사용할 수 있습니다.
cut -f 11 -d "|" $(find . -type f -iname "*.txt") | sort | uniq -d | sed 's/\\/./g' | while read duplicate; do grep -rHn "|$duplicate|" * ; done
로그 파일의 확장자로 내용을 변경해야 할 수도 있습니다 $(find -iname)
(또는 디렉터리의 유일한 파일이 로그 파일인 경우 삭제해야 할 수도 있습니다. 이렇게 하면 모든 로그 파일을 재귀적으로 찾아서 일치시킵니다.
일부 테스트 데이터의 출력은 다음과 같습니다.
test_data.txt:1:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known test_data.txt:5:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known test_data_2.txt:2:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known test_data.txt:3:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known test_data_2.txt:4:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known test_data.txt:7:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known
이는 필드 11이 반복되는 파일의 모든 행입니다.
이 명령의 기능에 대한 설명입니다.
cut -f 11 -d "|"
11번째 필드 가져오기(|로 구분)
find . -type f -iname "*.txt"
현재 디렉터리에서 .txt로 끝나는 모든 파일을 (재귀적으로) 고려합니다.
sort | uniq -d
"Field 11"의 중복 항목 모두 표시
sed /\\/./g'
이것은 bash를 망칠 수 있기 때문에 해킹입니다 \
. 이를 .
모든 문자와 일치할 수 있는 grep으로 대체합니다.
while read duplicate; do grep -rHn "|$duplicate|" *; done
- 중복 항목 목록을 반복하여 발생하는 모든 항목을 찾아 중복 항목이 발생한 파일 이름과 줄 번호를 출력합니다.
답변2
무엇을 하려는지 확실하지 않지만 다음과 같이 시도해 보겠습니다.
먼저, 당신의 경로는 무엇입니까? 당신은 그것을 한 줄로 제공합니다 :
Error: null, Data:|862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2011\07\05\ITE854075_RECardProtectionlogi.msg|Country not known
행이 다음과 같으면 키가 필드 11에 있는 것입니다.
2011\07\05\ITE854075_RECardProtectionlogi.msg
하지만 키를 정의하는 것은 무엇입니까? 11번째 게임에만 있는 건가요?
그렇다면 대상 파일이 있는 디렉터리에서 다음을 수행할 수 있습니다.
sort --field-separator='|' --key=11 <(\grep --recursive --line-number --color=always --with-filename '' *)
이렇게 하면 파일 이름의 컬러 출력이 제공되고 그 뒤에 해당 파일의 줄 번호가 표시되고 줄 자체가 모두 키 필드 11로 정렬되므로 출력에서 모든 파일의 일치하는 모든 키가 차례로 나타납니다. .....
나는 이것이 적어도 당신에게 단서를 줄 것이라고 생각합니다
노트: 앞의 백슬래시 는 앨리어싱을 grep
방지하기 위한 것입니다 grep
.