awk에서 문자열 변수 복사

awk에서 문자열 변수 복사

각 줄 앞에 해당 줄에 있는 슬래시 수를 나타내는 숫자를 추가하고 싶습니다.

awk '{ l=$0; gsub("[^/]","",l); print length(l),l }' 

l=$0참조로 할당된 것 같아서 작동하지 않습니다 . 꼬치 는 어떻게 하나요 dup?

표준 UNIX 도구를 사용하여 이를 수행하는 더 좋은 방법이 있습니까? 기본적으로 파일 경로 목록을 깊이(슬래시 수)별로 정렬하고 싶습니다.

답변1

아니요. awk항상 참조가 아닌 값으로 할당하세요.

이것오른쪽 스핀들변수 할당은표현하다이고 의 표현식은 awk항상 값을 반환합니다. 변수를 복사하려면 해당 값을 새 변수에 할당하기만 하면 됩니다.영향원래 변수.

존재하다:

$ echo 1 | awk '{l=$0; sub("1","2",l); print l, $0}'
2 1

l값만 수정되며 $0값은 변경되지 않습니다.


질문에 나온대로 다음을 수행하십시오.

awk -F '/' '{print NF-1, $0}' <file

구문 분석을 수행할 필요가 없습니다. awk스크립트 본문에 도달하기 전에 모든 작업을 수행해 드리겠습니다. 정보를 추출하면 됩니다.

답변2

매뉴얼에 따르면:

gsub(regexp, replacement [, target])

(대상이 생략된 경우 기본값 $0). gsub()대체된 횟수를 반환하므로 해당 경우 개수를 얻으려면 슬래시를 바꿔야 합니다.

awk '{l=$0; print gsub("/", ""), l}'

그러나 Etan Reisner가 지적했듯이 이 경우에는 할당이 필요하지 않습니다.

awk '{print gsub("/", "/"), $0}'

답변3

대신 사용하십시오 split:

   split(s, a[, fs ])
             Split the string s into array elements a[1], a[2], ..., a[n],
             and return n.  All elements of the  array  shall  be  deleted
             before  the  split is performed. The separation shall be done
             with the ERE fs or with the field separator FS if fs  is  not
             given. [. . .]

따라서 다음 입력 파일이 제공됩니다.

$ cat file
no slashes
one / slash
two / and /
consecutive 3 ///
none
one /

다음을 수행할 수 있습니다.

$ awk '{ n=split($0,a,"/"); print n-1,$0}' file
0 no slashes
1 one / slash
2 two / and /
3 consecutive 3 ///
0 none
1 one /

관련 정보