ファイルの各行から最初の^ Mを削除します。

ファイルの各行から最初の^ Mを削除します。

データは2行目から始まります。 最初のインスタンスを削除する単純なスクリプトまたはユーティリティはありますか?^m データ行あたり?

この質問は、次のように書き直すこともできます。^m2番目(偶数)インスタンスをすべて削除する方法は?興味深くスマートな答えをお楽しみください。 Ubuntuや同様の環境が望ましいです。

ここに画像の説明を入力してください。

生データは賢く切り取り、貼り付け、解析できます。

Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777^M,,,"Direct",3797,2241,24^M
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W^M,,,"Direct",3797,2241,4091^M

つまり、この質問をする理由は、予期しない^ mがLibre-Office Calc(スプレッドシート)からインポートの問題を引き起こしたためです。つまり、予想される改行が発生しました。

ここに画像の説明を入力してください。

答え1

ファイルをDOS形式(CRLF行の終わり)に維持すると仮定すると、削除できます。みんなCRを入力して行末にもう一度追加します。

だから

tr -d '\015' < srcfile | unix2dos > newfile

詳細な説明を編集:

これ

tr -d '\015'

剥がれるみんなファイルの control-M 文字。 -dtoはtr「削除」を意味し、'\015'8進形式のcontrol-M文字です。

これ

unix2dos

LF文字の前にCR(control-M)を挿入して、LF(改行; control-J;)文字をCRLFに変換します。これにより、unix形式のテキストファイルがDOS形式のテキストファイルに変換されます。

両方を組み合わせると、すべての不良^ Mが削除され、各行の末尾に^ Mのみがあることを確認します。

答え2

(あなたの画像が通常の白ではなく青で表示されることに基づいて、文字通り^Mキャレット+ Mの組み合わせではなくキャリッジリターン(CR)文字を参照しているとします。(はい、公開されている状況です。役に立つ)))

1)LibreOfficeにデータを提供するので、Unixスタイルの改行文字(CRLFではなくLFのみ)をうまく処理していることを確認し、すべてのキャリッジリターンを完全に削除できます。

tr -d '\r' < input > output

2)DOSスタイルのCRLF行の終わりを維持し、行の中央にあるCR:のみを削除するには(つまり、すぐ後ろにLFがない)、Perlで次のことを実行できます。

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

s/xxx/yyy/gxxxのすべての項目をキャリッジリターンとして解釈されるように置き換えますyyy。これは「後ろに」がないことを意味します。ここで、は改行/改行文字です。何も置き換えられないため、一致が削除されます。\r(?!\n)\n\n

sedと同様のことができますが、\rすべてのバージョンがエスケープをサポートしているわけではなく、sedコマンドラインctrl-Mに文字通り文字を入力するのは少し面倒です。 (UbuntuにはこれをサポートするGNU sedがありますが、Perlもあります。)

私は各行の最初の発生についてあなたが言ったすべてを無視し、最初の行を無視しました。入力には常に正しい数の偽の追加制御文字が含まれていると信じるのが少し脆弱であることがわかったからです。 (1行に^M:sが2つある場合、または存在しない場合はどうなりますか?)

答え3

以下は、利用可能な1つのオプションですsed

sed -i.bak '2,$s/\r//' filename

できること:

  1. -i.bak元のファイルのバックアップをfilename.bak
  2. 2,$2行目から始まり、ファイルの最後まで続きます。
  3. s/\r//各行から最初のキャリッジリターン(スクリーンショットの^ M)を削除します。

公開された抜粋のサンプルコマンドを使用して、viに手動でキャリッジリターンを入力しました。

$ cat -A test_sed
Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M$
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777^M,,,"Direct",3797,2241,24^M$
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W^M,,,"Direct",3797,2241,4091^M$

$ sed -i.bak '2,$s/\r//' test_sed

$ cat -A test_sed
Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M$
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777,,,"Direct",3797,2241,24^M$
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W,,,"Direct",3797,2241,4091^M$

答え4

トピックの質問に答えてください。ファイルから他のすべてのCR文字を削除します。、GNUを使用するawk

awk -v RS='\r' '{ORS = NR % 2 ? RT : ""; print}' < infile > outfile

偶数の場合は、(入力)レコード区切り記号をCRに設定し、出力レコード区切り記号をRTに設定します(このレコードのレコードターミネータは最後のレコードであり、入力がCR文字で終わらない場合はCRまたは空になる可能性があります)。記録の(時NR % 2 != 0)。

関連情報