awk를 사용하여 마지막 두 필드를 전환하세요

awk를 사용하여 마지막 두 필드를 전환하세요

탭으로 구분된 파일의 마지막 두 필드를 전환하는 방법을 찾고 있습니다. 필드 개수는 행마다 다르기 때문에 필드 번호를 지정할 수 없습니다.

온라인에서 찾을 수 있는 대부분의 내용은 도메인별 스크립트입니다. 예를 들어awk를 사용하여 두 열 교환

감사해요!

답변1

awk -F"\t" -v OFS="\t" 'NF>1 {t=$(NF-1); $(NF-1)=$NF; $NF=t} {print}' file

필드가 2개 이상인 경우에만 $NF및 간의 표준 교환이 가능합니다 . $(NF-1)-1 필드에 액세스하는 것은 치명적인 오류입니다(빈 줄인 경우 NF==0).

또한보십시오:GNU awk 필드

답변2

사용행복하다(이전 Perl_6)

raku -ne 'join( "\t", .words[0..*-3], .words[*-1] // "", .words[*-2] // "").trim-leading.put ;' 

기본적으로 위의 코드는 words공백으로 구분된 요소( ) 목록을 원하는 순서로 생성합니다(마지막 두 요소가 교체됨). 요소는 탭 join으로 \t편집되고 선행 공백이 잘려 trim-leading결과적으로 out 이 됩니다 put. 이 코드는 탭으로 구분된 열뿐만 아니라 공백으로 구분된 열에서도 작동합니다.

//Raku가 정의한 OR 연산자는 문자열 Nil컨텍스트의 값 문제를 방지하는 데 사용됩니다. ""필요한 경우 빈 문자열을 "삽입"합니다.

입력 예(첫 번째 줄은 비어 있음):

A
A   B
A   B   C
A   B   C   D
A   B   C   D   E
A   B   C   D   E   F

출력 예(각 줄의 마지막 두 요소가 교체되었습니다. 첫 번째 줄은 여전히 ​​비어 있습니다):

A   
B   A
A   C   B
A   B   D   C
A   B   C   E   D
A   B   C   D   F   E

https://docs.raku.org/routine/words
https://docs.raku.org/routine/join
https://raku.org

답변3

내장 변수를 사용하여 NF마지막 필드를 참조하여 끝에서 두 번째 필드( ) 앞에 인쇄할 수 있습니다 NF-1.

awk 'NF <= 1; NF > 1 {for (i = 1; i <= NF-2; i++) printf "%s\t", $i; print $NF"\t"$(NF-1)}' file.tsv

답변4

한 가지 접근 방식은 다음과 같습니다.

awk -F '\t' '
BEGIN {OFS=FS}
f=(NF>1){
  p = length-length($(NF-1)"x"$NF)
  print substr($0,1,p) $NF, $(NF-1)
}!f' file

관련 정보