두 열 중 하나가 비어 있는 줄을 제거하세요.

두 열 중 하나가 비어 있는 줄을 제거하세요.

다음과 같은 두 개의 열이 포함된 큰 콜론으로 구분된 텍스트 파일이 있습니다.

valueA:valueB
valueC:
valueD:valueE
:valueG

왼쪽에 데이터가 없는 경우또는콜론 오른쪽에서 전체 줄을 제거하고 싶습니다.

valueA:valueB
valueD:valueE

이 일을 어떻게 해야 할까요?

내가 가진 가장 가까운 것은 다음과 같습니다.

awk -F : '$2!=""' file > final_output

그러나 이는 행에 빈 열이 포함되어 있는지 여부에 관계없이 모든 것과 일치하는 것 같습니다.

답변1

귀하의 awk명령은 예제 라인을 올바르게 유지 valueA:valueB하고 라인 valueD:valueE을 제거합니다 valueC:. 따라서 "일치하는 것 같습니다"라는 말이 무슨 뜻인지 잘 모르겠습니다.모든 것").

:valueG첫 번째 필드를 전혀 테스트하지 않기 때문에 명령이 유지됩니다 .

"두 열 중 하나라도 비어 있는 줄을 인쇄하지 마십시오" awk는 다음과 같이 코딩할 수 있습니다.

awk -F : '! ( $1=="" || $2=="" )'

이 작업은 "각 열이 비어 있지 않은 줄만 인쇄"하는 것과 같습니다.

awk -F : '$1!="" && $2!=""'

Note는 awk문제를 해결하는 데 매우 적합한 도구입니다. 두 줄은 "구분 기호"( -F :), "열"/"필드"( $1, $2) "비어 있음"( ) 등 의 측면에서 원하는 논리를 반영합니다 …=="". 다른 도구를 사용하는 솔루션이 있을 수 있지만 해당 작업이 반드시 표현되는 것은 아닙니다. 논리가 너무 명확해요. 예를 들어 다음과 같습니다 grep.

grep '.:.'

위의 명령은 잘 작동하며 이전 명령보다 간단합니다 awk. 하지만 그 형식은 문제의 요점을 직접적으로 반영하지 않습니다. 미니멀리즘은 미학적으로 나를 기쁘게 하지만 여전히 awk그것이 옳다고 생각합니다.

답변2

sed와 세 가지 s명령 사용:

sed 'N; s/\n:/:/; s/\n/:/; s/:$//' file

산출:

값A:값B:값C
값D:값E:값G

에서 man sed:

N: 입력의 다음 줄을 패턴 공간에 추가합니다.

관련 정보