이 말이 가장 좋다고 말하는 데 시간이 좀 걸렸습니다.
질문 1:
텍스트 파일에서 시작과 끝의 문자열이 동일한 줄을 찾는 방법이 있습니까?
시작 문자열과 끝 문자열이 반드시 서로 동일할 필요는 없습니다.
두 문자열 사이의 텍스트에 있는 문자 또는 하이픈 수가 일치하지 않습니다.
문자열 사이에 하이픈이 있다는 점에 유의하세요(저는 이것을 큰 텍스트 파일에 추가했습니다).
예를 들어:
문서:
AAAAA-tjhut-ghyut-FILE1.txt
BBB-fhuj-dnbhg-frt76-FILE2.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
CCCC-fjuk-dryy-fhuj-FILE3.txt
테스트할 라인:
AAAAA-tjhut-ghyut-FILE1.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
질문 2:
처음과 끝 부분에 중복된 문자열이 포함된 줄을 제외하고 위에서 모든 줄을 제거하는 방법이 있습니까?
앞으로:
AAAAA-tjhut-ghyut-FILE1.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
뒤쪽에:
AAAAA-tjhut-ghyut-FILE1.txt
어떤 조언이라도 진심으로 감사드립니다.
참고: 첫 번째와 마지막 하이픈을 사용하면 중복된 문자열을 찾을 수 있다고 생각합니다.
답변1
질문 1: 아이디어:
- 두 번 반복
- 첫 번째 루프에서 인덱스(첫 번째 및 마지막 열)를 추출합니다.
- 인덱스 발생 횟수 계산
- 두 번째 루프는 모든 행을 다시 반복합니다(첫 번째 루프 내에 저장됨).
- 현재 행에서 인덱스를 다시 추출합니다.
- 인덱스 개수 > 1이면 인쇄
다음은 다음과 같이 저장된 예입니다 example.awk
.
#!/usr/bin/awk -f
BEGIN {
# field separator
FS="-";
}
{
# remember row for second loop
allRows[rowCount++]=$0;
# relevant columns
colFirst=$1;
colLast=$NF;
# create combined index: first column, space, last column
# count occurences of combined index
indexes[colFirst" "colLast]++;
}
END {
# loop through all input rows
for(currentRow in allRows) {
# extract combined index from current row
arrLen = split(allRows[currentRow],splitted,"-");
colFirst=splitted[1];
colLast=splitted[arrLen];
# output row if index count of current row > 1
if (indexes[colFirst" "colLast] > 1) {
# index count > 1, so print
print allRows[currentRow];
}
}
}
입력 파일 이름이 다음과 같은 경우 input.txt
:
awk -f example.awk < input.txt
내 결과:
AAAAA-tjhut-ghyut-FILE1.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
질문 2: 내가 이해한 바로는 첫 번째 행만 유지하려고 합니다.
awk -f example.awk < input.txt | head -n 1
head
: 출력 파일의 첫 번째 부분
-n 1
:처음 NUM줄을 인쇄하므로 1줄만 인쇄됩니다.