키-값 쌍에 맞춤 구분 기호 추가

키-값 쌍에 맞춤 구분 기호 추가

"키:값"(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/.$//'

관련 정보