공백으로 구분된 텍스트 파일이 주어지면 첫 번째 열에서 패턴을 찾으세요. 발견되면 해당 줄의 첫 번째 항목을 유지하고 나머지 항목을 삭제합니다.
입력(모드=1234):
1234 1111 2222
5678 3333 4444
1234 5678 9012
5678 1234 5678
1234 9786 5432
예상 출력:
1234 1111 2222
5678 3333 4444
5678 1234 5678
답변1
따라서 첫 번째 필드가 지정된 값이 아닌 모든 행을 인쇄하고 일치하는 첫 번째 행을 인쇄하려고 합니다.
awk -vF="$1" '{ if ($1 != F) { print; } else {if (!seen) { print ; seen=1}}}'
seen
awk 변수(이 경우)의 초기 값은 0이라는 점을 활용하세요.
답변2
첫 번째 일치하는 줄을 유지하고 GNU sed를 사용하여 이후의 모든 일치하는 줄을 삭제합니다.
sed -e '/^1234/{x;/./!{x;h;b;};d}' file
설명하다:
/^1234/
패턴 버퍼가 ^1234와 일치하는 경우
x
- 패턴과 저장 버퍼를 교환합니다(첫 번째 일치에서 저장 버퍼가 비어 있으므로 이제 패턴 버퍼도 비어 있습니다).
/./!
- 이제 패턴 버퍼가 비어 있습니까?
{x;h;b;}
- 그런 다음 패턴 버퍼와 홀드 버퍼를 교환(x)하고(현재 라인을 다시 패턴 버퍼에 넣음), 패턴 버퍼를 이전 버퍼(h)에 복사하고, 해당 라인의 실행 끝으로 분기합니다(b) - 즉, 다음 줄을 로드하고 sed 코드를 다시 시작하세요. 최종(d) 삭제는 실행되지 않습니다.
d
- 첫 번째 일치 후 보유 버퍼에는 macthing 라인의 복사본이 포함되므로 위의 {x;h;b;} 블록은 실행되지 않습니다. - 대신 현재 라인이 삭제되고 프로그램이 종료되며 다음 라인이 실행됩니다. 패턴 버퍼 영역에 로드되면 프로그램이 다시 시작됩니다.