2017-08-04 3 views
1

ファイルの列(正確な文字)をLinuxで交換する方法を知りたい(cut、awk、sedなどを使って助けてくれるもの) )。 私は、式全体(区切り記号を使用して)と単語全体をスワップする方法を見てきました。ファイルの列を入れ替える - Linux(正確な位置、単語ではない)

例:5でカラム3の交換

128934 
38 2008 

123984 
3802 08 

これを依頼する別の方法は、5番目の各列の3文字を交換することになります。 SEDとビット扱いにくい

答えて

1

$ sed -E 's/^(..)(.)(.)(.)/\1\4\3\2/' infile 
123984 
3802 08 

これは、4つのグループの各行の最初の5つの文字を捕捉し、それらを並べ替えます。 -Eは便宜上のものです。それがなければ、\(.\)のように括弧をエスケープする必要があります。

+0

おかげで、うまくいきました。もし私が88th(ちょっとした例)で30th charを変更したいのであれば、唯一の問題は大きなファイルになります。あなたの答えのグループ(..)は本当に大きなもの(...... 29ドット...)で、ドットをたくさん書くのではなく、これを書き換える方法はありますか? –

+0

'。{10}'は例えば10文字です。 –

2

あなたはこの非POSIX準拠の例ではgawk、のmawk、nawkのとbusyboxのののawkでそれを行うことができます。

awk -v FS='' -v OFS='' '{ t=$3; $3=$5; $5=t } 1' infile 

出力:

123984 
3802 08 
+2

文字に分割するためのnull charをFSとして使用するのは、POSIXごとに定義されていない動作なので、GNU awk(多分他のもの)でしか動作しないことに言及する必要があります。 gawkはあなたが望むことをしますが、他の人たちは間違いなくYMMVではありませんが、GNUツールを持っていればはるかに簡単なアプローチです。 –

+0

@エドモートン:お勧めします。私はそれをうまくテストしました:gawk、mawk、nawk、busybox awk – Thor

関連する問題