2017-12-01 25 views
0

最初の文字を最初の文字列の最後に移動し、最後の2文字の前にアンダースコアを挿入したいCSVファイルがあります。私はsedで手紙を動かす方法について何も見つけることができません。私はそれが9AT0582B_41Bになりたい、例えばCSVの最初の文字がフィールドの最後に移動

name,number,number1,status,mode 
B9AT0582B41,430,30,0,Loop 
B8AU0302D11,448,0,0,Loop 
B8AU0302D21,448,0,0,Loop 
B8AU0302D31,448,0,0,Loop 
B8AU0302D41,448,0,0,Loop 

B9AT0582B41:ここに私の例をCSVです。

各行でこれを行い、他のCSV値の状態を変更しないでください。

私はsed以外の形式にもオープンしています。 AWKで

+0

は '_41B' aのアンダースコアです:sedののバージョンがこれをサポートしていない場合は、同じことを別のオプションがありますかどうかを確認するためにあなたのmanページを確認するか、あなたはBRE表記を使用しようとすることができます打ち間違え? –

+0

いいえ、私はアンダースコアも必要です – Hunter

+1

どこに行くのですか?質問はどこにでも言及していない。 –

答えて

1

これは私の取り組みです。

$ sed -E 's/(.)(.{8})([^,]*)(.*)/\2_\3\1\4/' <<<"B9AT0582B41,430,30,0,Loop" 
9AT0582B_41B,430,30,0,Loop 

これは、読みやすくするために拡張正規表現を使用しています。 Sedの-Eオプションを指定すると、REが拡張表記で解釈されます。

$ sed 's/\(.\)\(.\{8\}\)\([^,]*\)\(.*\)/\2_\3\1\4/' <<<"B9AT0582B41,430,30,0,Loop" 
9AT0582B_41B,430,30,0,Loop 
+0

完璧!ありがとう – Hunter

3

$ awk -F, -v OFS=, \ 
    'NR > 1 { $1 = substr($1, 2, 8) "_" substr($1, 10) substr($1, 1, 1) } 1' infile 
name,number,number1,status,mode 
9AT0582B_41B,430,30,0,Loop 
8AU0302D_11B,448,0,0,Loop 
8AU0302D_21B,448,0,0,Loop 
8AU0302D_31B,448,0,0,Loop 
8AU0302D_41B,448,0,0,Loop 

これは,への入力および出力フィールドセパレータを設定します。その後、各行(最初のものを除く)は最初のフィールド(3回の呼び出しはsubstr)を再配置し、その行(最後に1)を出力します。

またはsedは、少し短い:

sed -E '2,$s/^(.)([^,]*)([^,]{2})/\2_\3\1/' infile 

これは、キャプチャグループ1で(アップライン2とのための)各行の最初の文字を取り込み、その後、すべてのものの2文字までの撮影で最初のカンマの前にグループ2、およびキャプチャグループ3のカンマの前の最後の2文字に置き換えられます。次に、置換によってアンダースコアがスワップされ、追加されます。

+0

これは完璧に動作します!アンダースコアはどうですか? – Hunter

+1

@Hunter、 'substr()'関数の使い方の例があります。あなた自身の質問に答えることはできますか?他のawk組み込みの文字列関数への参照は次のとおりです:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html –

+0

@hunter私はあなたの質問を編集してアンダースコア、答えを更新しました。 –

関連する問題