• ベストアンサー

特定のカンマの後にカンマを追加したい。

カンマ区切りテキストファイルの中身をsedコマンドを使用してカンマを一括で追加しようと思ったのですが、末尾にカンマを付けることは出来たのですが例えば特定カンマの次にカンマを追加する場合はどのようにすればいいでしょうか?(5つのカンマで区切のファイルに対して3カラム目の次に新しく追加するといった感じです。) 既に各カンマごとに値が入っているでそれを崩さずカンマの追加をしたいのですが。 参考までに自分が末尾にカンマを追加したときに使用した書式になります。 sed 's/$/,/g' test.txt > test2.txt よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • ky072
  • ベストアンサー率60% (85/140)
回答No.2

「.*」だとカンマが飲み込まれてしまうので、「[^,]*」にする必要があります。 sed 's/\([^,]*,[^,]*,[^,]*,\)/\1,/' test.txt > test2.txt sed 's/\(\([^,]*,\)\{3\}\)/\1,/' test.txt > test2.txt ほかには cut / paste を使うのも手っ取り早いです。 cut -d, -f1-3 test.txt > L.txt cut -d, -f4-5 test.txt > R.txt paste -d, L.txt /dev/null R.txt > test2.txt ただしどちらにしても、データを " で引用していて、データ内にカンマがあるようなケースは対応できませんのでご注意を。

barash
質問者

お礼

回答のほうありがとうございます。 上記の方法試しましたところうまくいきました。 cutとpasteを使った方が簡単にできそうです。 ありがとうございました。

その他の回答 (1)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

& やバックリファレンス \n 使えばいいです。 sed 's/^.*,.*,.*,/&,/' test.txt とか、 sed 's/^\(.*,\)\{3\}/&,/' test.txt \n はカラム入れ換えなども併用可。もしかすると多少書式間違えてるかも、マニュアル確認してください。 sed 's/^\(.*\),\(.*\),/\2,\1,/' test.txt

barash
質問者

お礼

回答のほうありがとうございます。 上記の方法試しましたところうまくいきました。 ありがとうございました。

関連するQ&A

  • ファイルの先頭に文字を追加するには?

    ファイルの先頭に文字を追加するにはどうしたらよいでしょうか? ファイルの末尾に追加するなら echo 追加する文字列 >> ファイル名 でオッケーですが、 先頭に追加する方法が、単純そうなのに、調べても分かりませんでした。 例えば test.txt の中身が以下で、 aaa bbb # echo hello >> test.txt で aaa bbb hello となりますが、 hello aaa bbb とするには、どうしたらよいでしょうか。 単純なコマンドはあるでしょうか。

  • sedでカンマ区切りの列の置換を行いたい

    以下の様なファイルがあります。 sedコマンドを使用して、カンマで区切られたn番目のカラム目を 置換したい場合どうすればよいでしょうか。 "1","2","3","4","5","6" "1234","12","34567","abcd","efg","hi" "a c","d f","12 34","0","AAA","" "g i","j l","45 67","0","BBB","2021" "m o","p r","3 2 1","1","ABC","" "123","456","","abc","efg","hij" ①1カラム目以外置換(1カラム目以降削除) sed 's/\(.*\),.*,.*,.*,.*,.*/\1/g' test.csv ②最後の6カラム目以外置換(6カラム目以外削除) sed 's/.*,.*,.*,.*,.*,\(.*\)/\1/g' test.csv ③3カラム目を置換(3カラム目を「""」だけにしたい) sed -e 's/\(.*\),\(.*\),.*,\(.*\),\(.*\),\(.*\)/\1,\2,"",\3,\4,\5/g' test.csv とできたのですが、 表現がないというか、置換対象文字列の条件、表現が長いというか、全カラムを指定しているので、 少し、短くできないものでしょうか。 ①パターン sed 's/\([^,]*\),.*/\1/g' test.csv ②パターン sed "s/.*,\([^,]*\)$/\1/g" test.csv の様にできました。 ③パターン 思いう浮かばず これで、できているので間違いはないかとおもいますが、 どうなのでしょうか。 なにかいい案はないでしょうか?

  • sed,awkでのデータ抽出方法

    教えてください。 awk,sed,シェルを使い、カンマ区切りのファイルの1カラム目と2カラム目をキーに、 あるファイルに含まれる行を削除するにはどうすればよいのでしょうか? 例) --aaa.csv-- 111,222,333,444 555,666,777,888 999,000,111,222 --file1.txt-- 111222 555666 の場合、aaa.csvより下記行のみほしい。 999,000,111,222 ご存知でしたら、ご教授ください。 よろしくお願いします。

  • CSVファイルの末尾のコンマ削除

    Excelを使ってCSVファイルを作りました。各行の長さが違うので、末尾に大量のコンマがありますが、途中の連続コンマを削除せずに末尾の連続コンマだけ削除する方法はありますか。 (現状) Ressya.,,,,,,,,,, Syubetsu=0,,,,,,,,,, EkiJikoku=020,021,,,025,026,027,,028,029,030 (目標) Ressya. Syubetsu=0 EkiJikoku=020,021,,,025,026,027,,028,029,030 (条件) 目的:OudiaSecondに貼り付ける コンマ区切り(スペース区切りは不可) Excel以外のソフトを使用しても可

  • perlで特定行から特定行までを抜き出しor置換

    perlで以下のようなことをしたいと考えています。 以下のことを、コマンドラインから「perl ~」という形で 実行したいのですが、どのよにすればよいでしょうか。 1.特定行から特定行までを抜き出し 2.特定行から特定行の範囲で文字列置換 例えば、次のようなテキストファイルがあったとします。 example.txt ================================== #START aaaa hogehoge test okok perl script #END ================================== 上記ファイルを読み込んで、 1.「#START」から「#END」の間に挟まれた行だけ抜き出し 2.「#START」から「#END」の間で、「test」を置換 のです。 sedで言うところの sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt をやりたいのです。

    • ベストアンサー
    • Perl
  • CUI環境でのCプログラム ランダムアクセスが分からない

    CUI環境でのCプログラムを作っています。 data.txtファイルの末尾に文字を追加させるプログラムを作っています。 ---data.txtの中身------- あああ いいいいい うううううううう ええ ------------------------ このdataファイルの末尾にコマンドプロンプトから文字を追加させるには、ランダムアクセスを使えばいいと思うんですが、どのようなプログラムにすれば良いのか分かりません。ランダムアクセスはバイナリファイルでしか使えないのでしょうか?

  • カンマ区切りでないテキストをcsvへ

    カンマ区切りしていないテキストファイルを一気にカンマ区切りしてcsvに変更することはできないのでしょうか?? 元のテキストファイルをワードパッドで開いてカンマ区切りし直して保存し、名前の変更でcsvに変更(拡張子が変更するとファイルが使用できなくなる可能性あり、というエラーは無視)したら読み込めるようにはなります。 しかしカンマ区切りし直すというのは面倒です。

  • 参照ファイルを用いて、複数のテキスト置換を一括で行

    参照ファイル(list.txt)を用いて、一括でファイルの中身(test.txt)を置換したいです。以下のようにワンライナーで書いたのですが、以下のようなエラーが出ました。 使っているのはMac Os10.15.5です。 何か問題があるのでしょうか? 間違っている点があれば教えていただきたいです。 sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' list.list | xargs -I{} sed -i '{}' test.txt sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o <list.txt> AAA aaa 111 222 abc efg ....

  • Perl 先頭行に追加

    恐れ入ります。 Perlで、配列がカンマで区切られたデータを読み込み、 その先頭行にデータを挿入したいのですが、 中々うまくいきません。 データ(/data/xxx.txt)の中身は、 test,test2 bbb,bbb2 ccc,ccc2 という感じで、カンマで区切られて改行で並んでいます。 そこに新たに$dateと$contで受けたデータを先頭行に追加する感じです。 open(FILE,"<./data/xxx.txt"); while($temp = <FILE>){ @temp=split(/,/,$temp); push(@ddr,"$temp[0]","$temp[1]"); } seek(@ddr,0,0); unshift(@ddr,($date,$cont."\n")); open(FILE,">./data/xxx.txt"); $new=join(",",@ddr); print FILE $new; close(FILE); このように書いていますが、 print FILE @ddr とすると、配列が壊れた状態(全て繋がる)で先頭行には挿入されたのですが、カンマで区切って配列にして並べようとしたら、 test,test2 ,bbb,bbb2, ,,ccc,ccc2,, という感じで上手く並びません。 よろしくおねがいします。

    • ベストアンサー
    • Perl
  • PHPで、○番目のカンマの文字を呼び出す方法

    0,123,45,678,999 など、カンマ区切りの情報がある data.txt というファイルがあり、 別のPHPファイルにdata.txtの内容を書き出したい場合、 <?php echo file_get_contents("data.txt"); ?> と書くと全部表示されてしまいます。 data.txtの1行目で、2番目と3番目のカンマの間の数字(上の例ですと123)を書き出すには、どのように書いたらよいか、お分かりになる方教えて頂けませんでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP