시작 부분에 문자열이 있고 끝 부분에 문자열이 포함된 줄을 텍스트 파일에서 제거하고 하나를 유지합니다.

시작 부분에 문자열이 있고 끝 부분에 문자열이 포함된 줄을 텍스트 파일에서 제거하고 하나를 유지합니다.

이 말이 가장 좋다고 말하는 데 시간이 좀 걸렸습니다.

질문 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줄만 인쇄됩니다.

관련 정보