첫 번째 항목을 제외한 모든 줄 삭제

첫 번째 항목을 제외한 모든 줄 삭제

공백으로 구분된 텍스트 파일이 주어지면 첫 번째 열에서 패턴을 찾으세요. 발견되면 해당 줄의 첫 번째 항목을 유지하고 나머지 항목을 삭제합니다.

입력(모드=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}}}'

seenawk 변수(이 경우)의 초기 값은 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;} 블록은 실행되지 않습니다. - 대신 현재 라인이 삭제되고 프로그램이 종료되며 다음 라인이 실행됩니다. 패턴 버퍼 영역에 로드되면 프로그램이 다시 시작됩니다.

관련 정보