質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Red Hat Enterprise

Red Hat Enterpriseは、レッドハット社により開発・サポートが行われている業務向けLinuxディストリビューションです。オープンソースで無償で利用することができ、バイナリ版の入手・サポートは有償です。商用ディストリビューションとして人気が高く、代表的なLinuxの選択肢の一つです。

Q&A

解決済

3回答

4427閲覧

【シェルスクリプト】CRLFとLFが混在するファイルのLFのみ変換

Fujic

総合スコア7

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Red Hat Enterprise

Red Hat Enterpriseは、レッドハット社により開発・サポートが行われている業務向けLinuxディストリビューションです。オープンソースで無償で利用することができ、バイナリ版の入手・サポートは有償です。商用ディストリビューションとして人気が高く、代表的なLinuxの選択肢の一つです。

0グッド

1クリップ

投稿2020/10/02 07:54

タイトルの通り
CRLFとLFが混在するファイルのLFのみ文字に変換する方法についてご教示ください。

環境はLinuxになります

改行をそれぞれ
[¥n]...LF
[¥r¥n]...CRLF

【対象ファイル名】
Test.csv

【内容】
aaaa,bbbb,”1234[¥n]
5678[¥n]
9123”,cccc[¥r¥n]

【理想の出力結果】
aaaa,bbbb,”1234;5678;9123”,cccc[¥r¥n]

【試したコマンドと実行結果】
cat Test.csv | tr ‘¥n’ ‘;’

aaaa,bbbb,”1234;5678;9123”,cccc[¥r]
;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

要するに\rが先行しない\nを削除すればいいわけですね。正規表現の後読み言明が利用できそうです。

perl -pe 's/(?<!\r)\n//' < input.txt > output.txt

追記: コメントでのご指摘を受けて修正。

perl -pe 's/(?<!\r)\n/;/' < input.txt > output.txt

投稿2020/10/02 08:09

編集2020/10/02 08:26
KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/10/02 08:21

理想の出力結果を見るに、「\rが先行しない\nを;に置換」じゃないかな。
guest

0

otnさん有り難うございます。
当初の目論見とは全然違う方向で解決したみたいです。

echo $'aa\nbb\r' | awk -v RS='\r\n' -v ORS='\r\n' '{gsub( "\n", ";", $0); print $0}' | sed '$d' | cat -v

aa;bb^M

いやはや、何事も勉強ですが・・・なんだかなあ。

投稿2020/10/02 10:02

編集2020/10/02 12:34
hana_yama_san

総合スコア923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/10/02 10:09

これは全然駄目ですね。 xargs が読んだ物は、sedの入力ファイル名の位置に来る。
hana_yama_san

2020/10/02 10:16

それは修正前の物では? 完全な検証は出来ないですが、 今部分的に徐々に検証して ブラッシュアップしております。
otn

2020/10/02 10:23

ああ、やっぱりそういうことがしたかったんですよね。 ただ、 echo $'aa\nbb\r' レベルで、やっぱり駄目ですが。 これが aa;bbCRLF にならないといけない。 sedだと少なくともパターンスペースを使わないと無理でしょう。
hana_yama_san

2020/10/02 10:39

sedのNとかhやH,G何かも色々考えましたが、 trに-sオプションが有るので救われたかも知れません。
hana_yama_san

2020/10/02 10:50

ひょっとしたらsedの's/\r;/\r\n/'は 's/\r;/\r/' だけで良いかもしれません (xargs -n 1 が改行を入れているから) しかしそこまで確認するとなると、本当に 自端末にLF,CRLF混在のテストデータを 用意しないといけなくなります。 windous使っている同居人はおそ帰りのため、 事実上不可能ですし、死ぬほど面倒くさいです。
otn

2020/10/02 10:57

2020/10/02 19:37 の物で言うと、最後のtrで、CRLF が CR; になっちゃいますね。
otn

2020/10/02 11:03 編集

テストは、Bashなら、 echo $'aa\nbb\r' が aa;bbCRLF になるかを、 echo $'aa\nbb\r' | ~~~~ | cat -v でチェックしましょう。これが最低ラインです。aa;bb^M と表示され、そのあと改行があればOK。 ややひねると、 echo $'a;;a\nb b\n\ncc\r' とか。
hana_yama_san

2020/10/02 11:12 編集

ご親切に、有り難うございます。 しかし、trの-sがそういう仕様なら、(というか、こちらでも確認しました) 改めて考え直さないといけないです。 sedのホールドスペースとか使うと結局全データを読み込む作りになりそうで、 全然改善案になりませんので。
hana_yama_san

2020/10/02 12:57 編集

いや、今日はこれだけでこのサイトに来た意味がありました。 「+」やベストアンサーを貰うのも悪くはないですが、 こういう勉強が出来るのが、最大の魅力です。 そして、それは質問者で得るのは難しく、 回答者として色々苦しむのが最適です。
guest

0

データサイズがそんなに大きくなければ、

sh

1tr '\n' ';' | sed 's/\r;/\r\n/g'

ファイル全体が一旦1行になるので、サイズによってはsedが処理しきれない可能性があります。

駄目な場合は、sedでもなんとかなるかも知れませんが、awk以上のツールでプログラム的に書くしか無いと思います。

#追記
sedで、CSVの1論理行(CRLF)単位で処理するようにしました。論理行数が多くても大丈夫です。

sh

1sed -i -n 'H;/\r$/{s/.//g;x;s/\n/;/g;s/^;//;p}' Test.csv

-iでファイルを直接更新。

投稿2020/10/02 08:11

編集2020/10/02 12:53
otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問