다음 형식의 파일이 있습니다.
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
(즉, 다음 명령을 실행하지 마십시오). - 입력 줄이 비어 있으면 이를 인쇄하고(빈 줄) 다음 명령을 실행하지 않고 다음 줄로 계속 진행합니다.
- 위의 항목 중 하나와 일치하지 않는 각 행에 대해 각 필드에 대해 최대하지만 포함하지 않습니다마지막으로 해당 장치 이름과 개행 문자가 인쇄되지만
|
개행 문자는 포함되지 않습니다. 그런 다음 마지막 필드는 개행 문자로 인쇄되지만 인쇄되지는 않습니다|
.