2016-06-26 5 views
2

フォーク、 awkコマンドを使用して重複を削除しました。問題は、各行の最後にCRLFがあるためです。私は比較からCRLFを捨てることができるawkの方法がありますか?私が使用しawkコマンドを使用してCRLFで重複ファイルを削除します。

コマンド:awk '!seen[$0]++'

録音

HelloworldCRLF 
how are youCRLF 
Helloworld 

最初と3番目のレコードは同じであり、私はそれを削除することが期待していました。最後の行には出力に残っているCRLFがないので、私は推測します。私は、レコードの終わりにCRLFを追加して、awkコマンドがそれを削除していることを確認しましたが、時には最後のレコードにCRLFがあり、余分な空白行があります(BecuaseにCRLFを追加します)。そのような状況を修正する方法はありますか?

ところで、ファイルはWindowsで生成されました。

+0

@WalterAこれは、各行の末尾だけでなく、ファイル全体から '\ r'sを削除します。そして、余分な' \ r'sはOPsの問題ではないので、問題は改行がありません(CRLF彼のケースでは)ファイルの最後に。 –

答えて

2

あなたはレコードセパレータにCRLFシーケンスを追加することができます。

awk -v RS='\n|\r\n' '!seen[$0]++' file 
+1

GNU awkまたはマルチキャラクタRSを可能にする他の非POSIX awkのみ。より簡潔に 'RS = '\ r?\ n" 'btwと書くことができます。これはOPの問題ではありませんが、彼の問題はファイルの末尾に改行(CRLFの場合)です。 –

3

は、比較を行う前\rのすべてのインスタンスを置き換えます。

awk '{gsub(/\r/,"")}; !seen[$0]++' 
+0

これは '\ r's中間行を削除します。実際には '/ \ r $ /'を使うべきです。これはOPの問題ではありませんが、彼の問題はファイルの末尾に改行(CRLFの場合)です。 –

2

あなたの問題は、Windowsが(誰もがこれまでのところだと思うように見えたとして)、それはあなたのファイルは末尾に改行(WindowsにCRLFの組み合わせがある)が欠落していることだすべてのLFの前にCRを追加したことではありませんファイルの終わりの改行を持たないファイルに対してUNIXコマンドを実行すると、その時点で真の "テキストファイル"ではないため、すべてのベットはオフになります。ファイルを生成しているツールを変更して改行を終わらせることはできますか?その後、awkのか、その上に他のツールを実行する前に

printf '\r\n' >> file 

をしない場合。その後、dos2unixを実行したり、必要に応じて\rを処理したり削除したりすることができます。たとえば、次の原因ファイルに不足している改行に最後Helloworld直後に私のプロンプトです

$ cat -v file 
Helloworld^M 
how are you^M 
Helloworld$ 

お知らせ$。今:

$ awk -v BINMODE=3 '!seen[$0]++' file | cat -v 
Helloworld^M 
how are you^M 
Helloworld 
$ 
$ printf '\r\n' >> file 
$ 
$ awk -v BINMODE=3 '!seen[$0]++' file | cat -v 
Helloworld^M 
how are you^M 
$ 
$ dos2unix file 
dos2unix: converting file file to Unix format... 
$ 
$ awk '!seen[$0]++' file | cat -v 
Helloworld 
how are you 
$ 

私はgawkのスクリプトがそれらを見る前\rのストリッピングから低レベルのプリミティブを停止するには、上記cygwinの上でのgawkで-v BINDMODE=3を使用する必要があります。

あなたのdodorstepに表示されるすべてのファイルに対してdos2unixを実行するだけの理由はありません。あなたはawkが正しく各行は3つのフィールドを持っていることを認識し、フィールド2であるのに対し、そのフィールド3は、1行目に空で見ることができるように

$ printf 'a\rb\r\nd\r\rf\n' > file 

$ cat -v file 
a^Mb^M 
d^M^Mf 

$ awk -v BINMODE=3 -F'\r' '{for (i=1;i<=NF;i++) print NF, i, "<"$i">"; print "----"}' file 
3 1 <a> 
3 2 <b> 
3 3 <> 
---- 
3 1 <d> 
3 2 <> 
3 3 <f> 
---- 

:フィールドの区切り文字としてキャリッジリターン(コントロール-MS)を使用してこのファイルを想像してみて2行目が空です。あなたは、それが\r\nを見たとき、それはそれだったドスラインエンディングを想定しているためdos2unixは、1行目から空のフィールド3を剥離することで、ファイルを破損していない見ることができるように

$ dos2unix file 
dos2unix: converting file file to Unix format... 

$ cat -v file 
a^Mb 
d^M^Mf 

$ awk -v BINMODE=3 -F'\r' '{for (i=1;i<=NF;i++) print NF, i, "<"$i">"; print "----"}' file 
2 1 <a> 
2 2 <b> 
---- 
3 1 <d> 
3 2 <> 
3 3 <f> 
---- 

を:それでは、それにDOS2UNIX実行して、もう一度試してみましょうFSの後にRSが続きます。

+0

ファイルの末尾に改行を入れることもできますし、欠落している可能性もあります。私はそれが問題を解決することを追加することを参照してください、私はそれをしましたが、それは新しい行として、次にこれを読み取る次のプロセスは、空のレコードとして扱います。すべてのファイルに対してdos2unixをUNIX上で実行するとすぐにそれを行うのがよい方法ですか? – Garfield

+0

すべてのファイルがレコードセパレータとしてキャリッジリターンとラインフィードを使用するわけではないため、ファイル内のデータの一部である可能性があります。あなたのアプリケーションで行送り( '\ n')の前に来るときに、キャリッジが返すもの(' \ r')**の意味**に依存します。私は私の答えに、すべてのファイルに対して 'dos2unix'を盲目的に実行できない理由を示す例を追加しました。また、dos2unixは行方不明の改行問題を解決しません。 '\ r'sを' \ n'sの前に取り除くだけで、ファイルの最後に改行を追加しません。それに対処する方法についてはGoogleにお問い合わせください。 –

+0

ハングアップ - なぜあなたは受け入れられた答えとしてhttp://stackoverflow.com/a/38036695/1745001を選択しましたか?答えが解決しようとしている問題(dos行末)はあなたの問題(ファイルの最後に改行がありません)とはまったく関係がありませんし、それがあなたの問題だったら正しい解決策ではありません。 –

関連する問題