新しい行がデータ内にあるときに、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