텍스트 처리를 위해 Unix 도구 사용

텍스트 처리를 위해 Unix 도구 사용

다음 형식의 파일이 있습니다.

abc|xyz|mno  
x up x  
up up x  
x x up  

abc|xyz|mno  
x x x  
up x x  

....  
....

기본적으로 파일의 첫 번째 줄은 장치 이름 (|ed)이고 다음 줄은 장치의 상태입니다.

출력을 다음 형식으로 만들고 싶습니다.

abc,x|xyz,up|mno,x  
abc,up|xyz,up|mno,x  
abc,x|xyz,x|mno,up  

abc,x|xyz,x|mno,x  
abc,up|xyz,x|mno,x  

....  
....  

조언이 있나요?

답변1

CPAN의 모듈 perl과 함께 을 사용할 수 있는 경우 :List::MoreUtils

$ perl -MList::MoreUtils=pairwise -F'\|' -anle '
    print and next if /^$/;
    @dev = @F and next if @F > 1;
    print join "|", pairwise {"$a,$b"} @dev,@{[split]};
' file
abc,x|xyz,up|mno,x
abc,up|xyz,up|mno,x
abc,x|xyz,x|mno,up

abc,x|xyz,x|mno,x
abc,up|xyz,x|mno,x

외부 모듈을 사용하고 싶지 않다면:

$ perl -F'\|' -anle '
    print and next if /^$/;
    @dev = @F and next if @F > 1;
    @state = split;
    print join "|", map {"$dev[$_],$state[$_]"} 0..$#dev;
' file

답변2

awk입력이 설명과 정확히 일치하는 경우 다음 명령을 사용하면 원하는 작업을 수행할 수 있습니다(그러나 오류 검사는 수행하지 않음).

awk '/\|/ {split($0, devices, "|"); next} /^$/ {print; next}
    {for (i=1; i<NF; i++) printf "%s,%s|", devices[i], $i; printf "%s,%s\n", devices[NF], $NF}'
  • 입력 줄에 a가 포함되어 있으면 |s |에서 "devices"라는 배열로 분할합니다. ( \|정상적인 |수단을 사용 하기 때문에 사용해야 합니다.또는,좋다 /cat|dog/. ) 입력 데이터 라인을 계속 실행합니다 next(즉, 다음 명령을 실행하지 마십시오).
  • 입력 줄이 비어 있으면 이를 인쇄하고(빈 줄) 다음 명령을 실행하지 않고 다음 줄로 계속 진행합니다.
  • 위의 항목 중 하나와 일치하지 않는 각 행에 대해 각 필드에 대해 최대하지만 포함하지 않습니다마지막으로 해당 장치 이름과 개행 문자가 인쇄되지만 |개행 문자는 포함되지 않습니다. 그런 다음 마지막 필드는 개행 문자로 인쇄되지만 인쇄되지는 않습니다 |.

관련 정보