예를 들어 다음과 같습니다.
이름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 입니다. 다음은 이러한 변수를 지정하는 몇 가지 방법입니다.
BEGIN 블록에 변수를 할당합니다.
awk 'BEGIN {FS = OFS = "\t"} { t = $10; $10 = $9; $9 = t; print } ' test.txt > test2.txt
awk 본문 뒤의 파일 목록에 변수 설정
awk '{ t = $10; $10 = $9; $9 = t; print } ' FS='\t' OFS='\t' test.txt > test2.txt
-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