2016-10-18 6 views
0

私は約500行と480K列のファイルを持っていますが、最後に2,3,4列を移動する必要があります。私のファイルはカンマで区切られたファイルですが、awkやsedを使ってこれを手早く手配する方法はありますか?awkまたはsedを使用して列を整列しますか?

+1

'ペーストを-d 、<(cut -d、-f1,5-input.txt)<(cut -d、-f2-4 input.txt) ' – twalberg

+0

何よりも速い?これまでに試したことと、簡潔でテスト可能なサンプル入力と期待される出力を表示するための質問を[編集]してください。すなわち、 [mcve]を提供する。 –

答えて

2

-

perl -F"," -lane 'print "@F[0]"," ","@F[4..$#F]"," ","@F[1..3]"' input.file 
+0

3,4,5を移動して2番目を削除します。 –

+0

[by-by-oneエラー](http://martinfowler.com/bliki/TwoHardThings.html) –

1

カラムを簡単にコピーすることができます。移動は480Kカラムでは長すぎます。

$ awk 'BEGIN{FS=OFS=","} {print $0,$2,$3,$4}' input.file > output.file 

どのようなデータ形式ですか?

+0

これはゲノムデータです。私たちは450Kポジションごとに個体をテストしています。 – Mdhale

1

5つのフィールドでのテスト:

$ cat foo 
1,2,3,4,5 
a,b,c,d,e 
$ cat program.awk 
{ 
    $6=$2 OFS $3 OFS $4 OFS $1 # copy fields to the end and $1 too 
    sub(/^([^,],){4}/,"")  # remove 4 first columns 
    $1=$5 OFS $1    # catenate current $5 (was $1) to $1 
    NF=4      # reduce NF 
} 1        # print 

が実行それ:

$ awk -f program.awk FS=, OFS=, foo 
1,5,2,3,4 
a,e,b,c,d 

だから理論的には、この作業をする必要があります:

{ 
    $480001=$2 OFS $3 OFS $4 OFS $1 
    sub(/^([^,],){4}/,"") 
    $1=$480000 OFS $1 
    NF=479999 
} 1 

はEDIT:それは仕事をしました。

+1

私が理解しているのは、480,000ではない480,000列です。 – karakfa

1

おそらくperlの:

perl -F, -lane 'print join(",", @F[0,4..$#F,1,2,3])' file 

または

perl -F, -lane '@x = splice @F, 1, 3; print join(",", @F, @x)' file 

別のアプローチ:正規表現

perl -lpe 's/^([^,]+)(,[^,]+,[^,]+,[^,]+)(.*)/$1$3$2/' file 

500行ファイルとのタイミングを、48万フィールドを含む各ライン

$ time perl -F, -lane 'print join(",", @F[0,4..$#F,1,2,3])' file.csv > file2.csv 
40.13user 1.11system 0:43.92elapsed 93%CPU (0avgtext+0avgdata 67960maxresident)k 
0inputs+3172752outputs (0major+16088minor)pagefaults 0swaps 

$ time perl -F, -lane '@x = splice @F, 1, 3; print join(",", @F, @x)' file.csv > file2.csv 
34.82user 1.18system 0:38.47elapsed 93%CPU (0avgtext+0avgdata 52900maxresident)k 
0inputs+3172752outputs (0major+12301minor)pagefaults 0swaps 

、純粋なテキスト操作は勝者

$ time perl -lpe 's/^([^,]+)(,[^,]+,[^,]+,[^,]+)(.*)/$1$3$2/' file.csv > file2.csv 
4.63user 1.36system 0:20.81elapsed 28%CPU (0avgtext+0avgdata 20612maxresident)k 
0inputs+3172752outputs (0major+149866minor)pagefaults 0swaps 
+0

これを行うためにPerlスクリプトを作成しましたが、これも確認できます。 – Mdhale

+0

'time'を使って480000 colsのタイムを持つ1レコードの後者は、平均で少し速かった。 –

1

別の技術、ちょうどbashのである:あなたが解決策の下に試すことができ

while IFS=, read -r a b c d e; do 
    echo "$a,$e,$b,$c,$d" 
done < file 
関連する問題