"키:값"(901 S 902 M 905 F 906 WAPENC 907 31 908 371 909 38765469947/TYPE=PLMN 등) 형식의 데이터가 있습니다. 여기서 키는 901,902,905,906...등과 해당 값입니다. S, M, F, WAPENC, 31... 뒤에 공백이 있습니다.
입력 예
901 S 902 M 905 F 906 WAPENC 907 31 908 371 909 38765469947/TYPE=PLMN ..... continuous data
key:value,key:value... 형식으로 변환하고 싶습니다.
원하는 출력:
901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN and so on .....
Perl과 sed를 사용해 보았지만 예상한 결과를 얻지 못했습니다.
답변1
또 다른 awk
해결책:
awk '{
for (i=1; i<=NF; i++)
printf $i (i==NF ? ORS : (i%2 ? ":" : ","))
}' file
시험:
$ printf 'a\na b\na b c\na b c d\n' | awk '{
for (i=1; i<=NF; i++)
printf $i (i==NF ? ORS : (i%2 ? ":" : ","))
}'
a
a:b
a:b,c
a:b,c:d
답변2
이와 같이?
% perl -pe 's/(\S+) (\S+) ?/$1:$2,/g; s/,$//' file.txt
901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN
또는
% sed -E -e 's/([^ ]+) ([^ ]+) ?/\1:\2,/g; s/,$//' file.txt
901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN
둘 다 기본적으로 공백이 아닌 문자열, 공백, 공백이 아닌 다른 문자열 및 선택적 공백을 가져온 다음 캡처된 공백이 아닌 문자열을 쉼표와 콜론 으로 다시 넣습니다. 그런 다음 줄 끝에서 마지막 콜론 쉼표를 제거합니다. 마지막에 이상한 필드가 있으면 그대로 유지됩니다. 즉, 입력은 foo bar doo
가 됩니다 foo:bar,doo
.
또는 AWK에서는 필드를 반복합니다.
% awk '{ for (i=1; i <= NF; i+=2) {printf "%s:%s", $i, $(i+1); if (i <= NF - 2) printf "," }; printf "\n" }' file.txt
901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN
(이것은 끝에 쉼표 콜론을 추가하여 foo bar doo
이 됩니다 .)foo:bar,doo:
답변3
이는 다음과 같이 tr 및 sed 명령을 사용하여 수행할 수 있습니다.
$ tr ' ' '\n' < infile.txt | sed '1~2s/$/:/' | sed '2~2s/$/,/' | tr -d '\n'
901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN,
설명하다
첫 번째 tr은 한 줄에 하나의 항목을 배치합니다.
첫 번째 sed는 라인 1부터 시작하여 다른 모든 라인의 끝에 콜론을 추가합니다.
두 번째 sed는 2번째 줄에서 시작하여 한 줄씩 건너뛰어 줄 끝에 쉼표를 추가합니다.
마지막 tr은 모든 줄 끝을 제거하여 이전과 같이 긴 데이터 문자열을 만듭니다.
마지막 쉼표를 제거하려면 다른 sed를 사용하십시오.
sed 's/.$//'