하나의 열에 여러 문자열을 처리하는 방법

하나의 열에 여러 문자열을 처리하는 방법

그의 형식과 비슷한 쉼표로 구분된 파일이 있습니다.

aa.com,1.21.3.4,string1 string2 K=12     K2=23  K3=45 K4=56
bb.com,5.6.7.8,string1 string2 K=66     K2=77  K3=88 K4=99

공백으로 구분된 문자열이 포함된 세 번째 열을 가져오고 싶습니다. 세 번째 열의 처음 두 문자열을 쉼표로 구분하고 세 번째 열의 나머지 문자열을 무시하도록 파일을 처리하고 싶습니다. 처음 두 필드에는 공백이 포함되어 있지 않습니다. 세 번째 열의 문자열 수가 모든 레코드에 대해 고정되어 있지는 않습니다. 이 예에서는 5개의 공백으로 구분된 6개의 문자열입니다. 그러나 그것은 어느 정도일 수 있습니다.

필요한 것은 세 번째 열의 처음 두 문자열을 가져와서 쉼표로 구분하고 세 번째 열 문자열의 나머지 부분을 무시하는 것입니다.

aa.com,1.21.3.4,string1,string2
bb.com,5.6.7.8,string1,string2

답변1

노력하다:

awk '{print $1, $2}' OFS=, infile
aa.com,1.21.3.4,string1,string2
bb.com,5.6.7.8,string1,string2

이 경우 첫 번째 또는 두 번째 필드에 공백이 있는 경우 다음을 수행합니다.

awk -F, '{ match($3, /[^ ]* +[^ ]*/); 
           bkup=substr($3, RSTART, RLENGTH);
           gsub(/ +/, ",", bkup); # replace spaces with comma
           print $1, $2, bkup
}' OFS=, infile

설명하다:읽다남성awk:

match(s, r [, a])  
          Return the position in s where the regular expression r occurs, 
          or 0 if r is not present, and set the values of RSTART and RLENGTH. (...)

substr(s, i [, n])
          Return the at most n-character substring of s starting at I.
          If n is omitted, use the rest of s.

RSTART
          The index of the first character matched by match(); 0 if no
          match.  (This implies that character indices start at one.)

RLENGTH
          The length of the string matched by match(); -1 if no match.

답변2

이 시도:

awk -F '[, ]' '{print $1","$2","$3","$4}' file
aa.com,1.21.3.4,string1,string2
bb.com,5.6.7.8,string1,string2

답변3

다음과 같이 이 작업을 수행할 수 있습니다.

sed -ne 's/[[:blank:]]\{1,\}/,/;s//\n/;P' input-file.txt 

답변4

awk -F "[, ]" '{print $1,$2,$3,$4;OFS=","}' file

F "[, ]"공백과 쉼표는 필드 구분 기호로 사용되며 ;OFS=","출력 필드 구분 기호는 쉼표로 설정됩니다.

관련 정보