탭 구분 기호를 유지하면서 tsv 파일의 열을 바꾸는 방법은 무엇입니까? [복사]

탭 구분 기호를 유지하면서 tsv 파일의 열을 바꾸는 방법은 무엇입니까? [복사]

예를 들어 다음과 같습니다.

이름1 2 3 4 5 6 7 8

탭 구분 기호 사용 ^

2개의 열(예: 0에서 시작하는 경우 열 7과 열 8) 간에 전환하고 싶으므로 다음과 같습니다.

이름1 2 3 4 5 6 8 7

결국에는 다른 열 인덱스가 되어야 합니다.

awk를 사용해 보았지만 오류가 많이 발생했습니다. 설명해주실 수 있나요?

내가 시도한 명령은 다음과 같습니다.

awk ' { t = $10; $10 = $9; $9 = t; print > "test2.txt"; } ' test.txt 

새 파일을 생성하지만 탭 구분 기호는 없습니다. (공백 구분 기호 포함)

답변1

나는 이것을 awk하는 방법을 모르므로 여기에 간단한 bash 스크립트가 있습니다.

#!/usr/bin/env bash

while IFS='' read -r i || [[ -n "$i" ]]; do
  cut -f1,2,3 -z <<<"$i"
  printf '\t'
  cut -f10 -z <<<"$i"
  printf '\t'
  cut -f5,6,7,8,9 -z <<<"$i"
  printf '\t'
  cut -f4 <<<"$i"
done <colinput.txt

"-z" 잘라내기 옵션은 개행 문자를 인쇄하지 않습니다. -f1,2,3,4,5,6,8,7절단해도 출력의 열 위치가 변경되지 않으므로 가능한 옵션이 없습니다 . 잘라내기의 기본 구분 기호는 탭입니다.

답변2

구분 기호만 지정하면 됩니다. 전혀,입력 필드 구분 기호는 FS 변수입니다.출력 필드 구분 기호OFS 입니다. 다음은 이러한 변수를 지정하는 몇 가지 방법입니다.

  1. BEGIN 블록에 변수를 할당합니다.

    awk 'BEGIN {FS = OFS = "\t"} { t = $10; $10 = $9; $9 = t; print } ' test.txt > test2.txt
    
  2. awk 본문 뒤의 파일 목록에 변수 설정

    awk '{ t = $10; $10 = $9; $9 = t; print } ' FS='\t' OFS='\t' test.txt > test2.txt
    
  3. -F 및 -v 옵션 사용

    awk -F '\t' -v OFS='\t' '{ t = $10; $10 = $9; $9 = t; print } ' test.txt > test2.txt
    

또한 열 번호를 지정하기 위해 이와 동일한 기술을 사용할 수 있습니다. 매개변수를 전달하는 가장 깔끔한 방법이므로 -v를 사용하는 것을 선호합니다.껍데기변수는 다음과 같이 변환됩니다.바꾸다.

awk -F '\t' -v OFS='\t' -v a=9 -v b=10 '{
    t  = $a
    $a = $b
    $b = t
    print 
}' test.txt > test2.txt

관련 정보