unix 명령을 통해 키 값 쌍이 포함된 텍스트 파일을 정렬된 출력으로 변환하는 방법

unix 명령을 통해 키 값 쌍이 포함된 텍스트 파일을 정렬된 출력으로 변환하는 방법

다양한 변수에 대해 가능한 값 범위가 포함된 텍스트 파일이 있습니다.

1. life:        short,long,na.
2. weather_f:   cloudy,rainy,sunny,foggy,cold,warm,mild,
                    humid,na.
3. sea_temp:    warm,mild,cold,na.

아래와 같은 출력 파일을 얻고 싶습니다.

short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na

나는 이것을 사용해 보았 sed으나 새로운 라인 weather_f때문에 어려움을 겪었습니다. 예상되는 결과를 어떻게 얻을 수 있나요?

답변1

줄이 쉼표로 끝나면 즉시 다음 줄을 버퍼에 추가합니다. 이는 sed표현식을 사용하여 수행됩니다.

/,$/N

N명령은 개행 문자를 둘 사이의 구분 기호로 사용하여 버퍼의 텍스트에 다음 줄을 추가합니다.

이러한 연속된 여러 줄을 허용하려면 루프의 시작 부분으로 돌아가서 버퍼 끝에 쉼표가 있는지 확인하세요.

:again
/,$/ {
    N

    # branch to the "again" label at the top
    b again
}

그 후에는 더 이상 버퍼에 라인을 추가할 필요가 없으므로 라인을 자르고 원하는 대로 배열할 수 있습니다. 여기에는 첫 번째 문자 앞의 모든 항목 제거 :, 공백과 유사한 모든 문자(삽입된 줄 바꿈 포함 N) 제거, 후행 점 제거가 포함됩니다.

s/[^:]*://
s/[[:space:]]//g
s/\.$//

전체 편집 스크립트는 다음과 같습니다.

:again
/,$/ {
    N
    b again
}
s/[^:]*://
s/[[:space:]]//g
s/\.$//

이는 파일(여기)의 스크립트를 사용하여 script수행할 수 있습니다 .

sed -f script file

또는 명령줄에 스크립트를 입력하려면

sed -e :again \
    -e '/,$/ { N; b again; }' \
    -e 's/[^:]*://' \
    -e 's/[[:space:]]//g' \
    -e 's/\.$//' file

귀하의 질문에 데이터가 주어지면 다음이 출력됩니다.

short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na

일부 구현에는 고유한 표현이 sed필요할 수 있습니다 .b again

sed -e :again \
    -e '/,$/ { N' -e 'b again' -e '}' \
    -e 's/[^:]*://' \
    -e 's/[[:space:]]//g' \
    -e 's/\.$//' file

관련 정보