탭으로 구분된 파일의 마지막 두 필드를 전환하는 방법을 찾고 있습니다. 필드 개수는 행마다 다르기 때문에 필드 번호를 지정할 수 없습니다.
온라인에서 찾을 수 있는 대부분의 내용은 도메인별 스크립트입니다. 예를 들어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