新しい行がデータ内にあるときに、txtファイルの行数をカウントします

Nov 27 2020

以下のデータを含む1つのtxtファイルがあります

Name    mobile  url message text
test11  1234567890  www.google.com  "Data Test New
Date:27/02/2020
Items: 1
Total: 3
Regards
ABC DATa
Ph:091 : 123456789"
test12  1234567891  www.google.com  "Data Test New one
Date:17/02/2020
Items: 26
Total: 5
Regards
user test
Ph:091 : 433333333"

これで、最後の列データに改行文字が含まれていることがわかります。だから私が以下のコマンドを使うとき

awk 'END{print NR}' file.txt

私の長さは15ですが、実際には線の長さは3です。同じためのコマンドを提案してください

編集された部分:入力ファイルの最後に改行がない場合、以下のスクリプトは機能しません。

awk -v RS='"[^"]*"' '{gsub(/\n/, " ", RT); ORS=RT} END{print NR "\n"}' test.txt 

また、私のファイルには300万から400万のレコードが含まれている可能性があります。したがって、ファイルをUNIX形式に変換するには時間がかかりますが、それは私の好みではありません。したがって、両方の場合に機能するはずの最適なソリューションを提案してください

head 5.csv | cat -A  
Above command is giving me the output

モバイルURLメッセージテキストに名前を付けます^ M $

回答

7 anubhava Nov 27 2020 at 09:49

を使用gnu-awkすると、カスタムを使用してこれを行うことができますRS

awk -v RS='"[^"]*"' '{gsub(/(\r?\n){2,}/, "\n"); n+=gsub(/\n/, "&")}
END {print n}' <(sed '$s/$//' file)

15001

ここに:

  • -v RS='"[^"]*"':この正規表現を入力レコード区切り文字として使用します。二重引用符で囲まれた文字列に一致します
  • n+=gsub(/\n/, "&"):ダミー\nはそれ自体に置き換えられ\n、変数にカウントされますn
  • END {print n}n最後に印刷します
  • sed '$s/$//' file:最後の行に改行を追加します(行方不明の場合)

コードデモ

1 Sundeep Nov 27 2020 at 10:14

を使用するとperl、最後の行が常に改行文字で終わると想定します

$ perl -0777 -nE 'say s/"[^"]+"(*SKIP)(*F)|\n//g' ip.txt
3
  • -0777 入力ファイル全体を単一の文字列として丸呑みするため、入力ファイルが非常に大きい場合、これは適切ではありません。
  • このsコマンドは、行われた置換の数を返します。これは、ここで改行の数を取得するために使用されます。
  • "[^"]+"(*SKIP)(*F) 二重引用符で囲まれた改行は無視されます

改行文字で終わっていなくても最後の行をカウントしたい場合は、以下のコマンドを使用できます。

perl -0777 -nE 'say scalar split /"[^"]+"(*SKIP)(*F)|\n/' ip.txt
Thor Nov 27 2020 at 13:10

anubhavaと同じですが、GNUsedを使用します。

<infile sed '/"/ { :a; N; /"$/!ba; s/\n/ /g; }' | wc -l

出力:

3