텍스트 파일을 변환하려고 하는데 원하는대로 정리하기가 좀 어려운 것 같습니다.
파일은 아래와 같습니다.
(0,{35=9000.0, 36=9000.0, 33=9000.0, 34=9000.0})
다음과 같이 재구성하고 싶습니다
0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0
저는 Shell을 처음 접했기 때문에 문제를 해결하려면 여러분의 도움이 필요합니다. 항목을 의 값으로 정렬하고 싶습니다 {}
.
답변1
Perl의 솔루션은 다음과 같습니다.
cat b.txt
(0,1,{35=9000.0, 36=9000.0, 33=9000.0, 34=9000.0})
perl -lne '$_=~/^\(([\d\,\.]+)\s*\{(.*)\}\)$/; @first=split /[,\s]/, $1; @second=split /,\s/, $2; map{($k, $v) = split "=", $_; $h{$k}=$v} @second; foreach $k (sort keys(%h)) { print join(" ", @first), " $k ",$h{$k}; }' b.txt
0 1 33 9000.0
0 1 34 9000.0
0 1 35 9000.0
0 1 36 9000.0
(물론, 이 Perl 프로그램은 한 줄 이상을 사용하고 변수에 의미 있는 이름을 지정하는 방법을 알고 있다면 읽기가 더 쉬울 것입니다)
답변2
암소 비슷한 일종의 영양앗해결책:
awk -F'[,=]' '{ gsub(/[({}) ]/,"",$0); for(i=2;i<NF;i+=2) a[$i]=$(i+1);
asorti(a,b); for(k in a) print $1,k,a[k] }' file
-F'[,=]'
- 필드 구분 기호gsub(/[({}) ]/,"",$0)
- 불필요한 문자 제거for(i=2;i<NF;i+=2) a[$i]=$(i+1)
- 값 쌍을 배열로 수집a
asorti(a,b)
-a
키를 기준으로 배열 정렬
산출:
0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0
답변3
- 각 입력 줄에 대해
$n
<= 선행 쉼표 앞의 10진수 값입니다. %h
해당 키는=
왼쪽 숫자와 오른쪽 값의 해시입니다.- 그런 다음 키를 숫자로 정렬하고
$n
, key, corresp를 인쇄합니다. 값. $,
=OFS
<=$"
= 출력 목록 구분 기호, 기본값은 공백입니다.
perl -lne '$,=$";
($n, %h) = ( /^\((\d+),/, /(\d+)=([^,}]+)/g );
print $n, $_, $h{$_} for sort { $a <=> $b } keys %h;
' yourfile
결과:
0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0