たとえば、次のようになります。
名前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