awk: 수정된 열을 파일에 추가하고 원래 열을 유지합니다.

awk: 수정된 열을 파일에 추가하고 원래 열을 유지합니다.

두 개의 열이 있는 파일이 있습니다.

path/path/target1.target2 column2

awk를 사용하여 인쇄하고 싶습니다.

column1 column2 target1 target2

수정하기 위해 다음과 같이 시도했지만 원래 열이 손실되었습니다.

$ awk '{gsub("\\..*","", $(gsub(".*/","", $1))); gsub(".*_","", $1); print $0}'
target1 column2

어떻게 해야 하나요? 이 행동을 설명할 수 있나요?

답변1

방법 은 다음과 같습니다 awk.

$ awk '{ 
         split($1,parts,"."); 
         sub(".*/","",parts[1]); 
         print $1, $2, parts[1], parts[2]
       }' file
path/path/target1.target2 column2 target1 target2

왜 당신의 것이 작동하지 않는지에 관해서는엠마 루오가 설명하다, 이는 값을 변경하여 $1더 이상 예상대로 인쇄할 수 없기 때문입니다.

답변2

sed대신 다음 을 사용합니다 awk.

sed -E 's!([^/]*)\.([^ ]*) (.*)!& \1 \2!'

단일 라인 예에 대한 출력:

path/path/target1.target2 column2 target1 target2

필드를 자신만의 명령으로 awk바꾸는 이유에 대해서는 gsub(참조 man awk) 문서에 다음과 같이 기록되어 있습니다.

gsub(r,s,t) gsub(r,s)전역 대체, r변수에서 정규 표현식과 일치하는 모든 항목이 t문자열 s[...] 로 대체됩니다.

즉, 예 를 들어 twhere $1에 대한 값을 제공하는 경우gsub(".*/","", $1)교체됨교체로. $1를 적용하기 전에 별도의 변수에 복사 해야 합니다 gsub. 그렇지 않으면 비표준을 사용하여 gensub수정된 문자열을 반환합니다.

답변3

awk를 사용하십시오.

$ awk '{n=split($1,a,"[/.]"); print $0, a[n-1], a[n]}' file
path/path/target1.target2 column2 target1 target2

또는 원하는 경우:

$ awk '{x=$1; gsub(/.*\/|\./,OFS,x); print $0 x}' file
path/path/target1.target2 column2 target1 target2

원래 스크립트에는 여기서 설명하지 말아야 할 몇 가지 기본적인 문제가 있습니다. Arnold Robbins가 쓴 "Effective AWK 프로그래밍, 5판" 책을 구해서 이에 대해 읽어보고 gsub()$의미를 읽어보세요.

답변4

사용행복하다(이전 Perl_6)

sed...이제 답을 얻었으니 Perl 및/또는 Raku를 사용해 보는 것이 어떨까요?

~$ raku -ne 'my @a = .split(:skip-empty, /  \.  |  ^ .* <[/]> /)>>.words.flat; say @a.raku;'  file

#OR (more simply)

~$ -ne 'my @a = .split(:skip-empty, /  \.  |  ^ .* <[/]> /).words; say @a.raku;'   file

입력 예:

path/path/target1.target2 column2

예제 출력:

path/path/target1.target2 column2 target1 target2

즉, -ne비자동 인쇄 명령줄 플래그를 사용하여 입력을 한 줄씩 읽습니다.split누구나.지점또는행의 시작 부분부터 마지막 ​​행까지의 경로 텍스트를 공백으로 구분된 경로 (예: 열) /로 나눕니다 . words이는 @a배열에 저장됩니다. 출력의 경우 첫 번째 줄은 $_있는 그대로 인쇄되고 그 뒤에 @a배열의 처음 두 요소가 인쇄됩니다.

https://raku.org

관련 정보