awk와 함께 gsub를 사용하여 모든 문자열에 적용하는 방법

awk와 함께 gsub를 사용하여 모든 문자열에 적용하는 방법

gsub모든 문자열에 적용하기 위해 with를 사용해 보았지만 awk실패했습니다.

gsub(/^ *| *$/,"", $4);

string 에 적용하고 싶지 않고 $4모든 문자열에 적용하고 싶습니다. 시도했지만 $0실패했습니다.

뭐가 문제 야?

awk '{ 
     split($12, a, /[/:]/); 
     if (length(a[2]) == 1) $12=sprintf("%s:%02d/%d", a[1], a[2], a[3]);
     gsub(/^ *| *$/,"", $0);
     print $9, $12, $10, $2, $3, $4, $5, $6, $7, $8, $13 
 }' FS='|' OFS=',' file

|f_name:x|l_name:x| address:x x | city:x |state:x|zip:x|country:x|ordernumber:x|code:x|downloaded:x| exp:9/2017|ip:x.x.x.x|

산출

ordernumber:x,exp:09/2017,code:x,f_name:x,l_name:x,address:x x,city:x,state:x,zip:x,country:x,ip:x.x.x.x

답변1

필드 (또는 루프 카운터의 이름을 지정하는 데 사용한 모든 항목)를 반복 1하고 참조합니다. 구문은 C와 유사합니다.NF$i

for (i = 1 ; i <= NF ; i++) {
    ...
}

예를 들어

$ echo "  foo bar  :doh : bla:" |awk -vOFS=: -F: '
    { for (i = 1 ; i <= NF ; i++) gsub(/^ +| +$/, "", $i) } 1'
foo bar:doh:bla:

/^ */( as 로 변경한 것은 전자를 무시 /^ +/하는 것 같습니다 .)mawk^

답변2

각 필드(필드가 문자 "|"로 구분됨)에서 공백을 제거하려는 경우 해당 공백을 포함하도록 필드 구분 기호를 변경하면 됩니다. awk가 필드 구분 기호로 정규 표현식을 지원한다고 가정하면 FS='|'설정을 다음으로 바꾸십시오.

FS=' *\\| *'

|문자열은 이제 패턴이므로 이스케이프가 필요합니다 .

첫 번째 필드의 시작 부분과 마지막 필드의 끝 부분에 있는 공백은 처리되지 않습니다. 이것에 sub(/^ */,"",$1)및 를 사용할 수 있습니다 sub(/ *$/,"",$NF).

관련 정보