두 개의 열이 있는 파일이 있습니다.
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
[...] 로 대체됩니다.
즉, 예 를 들어 t
where $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
배열의 처음 두 요소가 인쇄됩니다.