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

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

공백으로 구분된 텍스트 파일이 있으면 첫 번째 열에서 패턴을 찾습니다. 발견되면 첫 번째 항목을 유지하고 다른 줄을 삭제합니다.

입력(패턴 = 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;} 블록은 실행되지 않습니다. 대신 현재 라인이 삭제되고 프로그램이 종료되고 다음 라인이 로드됩니다. 패턴 버퍼에 들어가고 프로그램이 다시 시작됩니다.

관련 정보