1

私は正規表現とテキスト処理の初心者です。私がする必要があるのは、ファイル内のテキストをCSV形式にフォーマットして、スプレッドシートにインポートすることです。

特定の範囲の数値を見つけて、\rその後にキャリッジリターンを挿入し、カンマを削除する必要があります。特定の文字を検索/置換する方法は知っていますが、文字や数字の範囲はわかりません。

これが取引です。この形式の長いテキストファイルがあります。

Shimshon A
(blank)
November 24, 2012
13,481
jonathan t
Laguna Niguel, CA
November 24, 2012
13,480
scott b
Sussex, NJ
November 24, 2012
13,479

検索/置換を使用して、テキストエディタに行末のコンマと行末の引用符を追加しました。

"Shimshon A",
"(blank)",
"November 24, 2012",
"13,481",
"jonathan t",
"Laguna Niguel, CA",
"November 24, 2012",
"13,480",
"scott b",
"Sussex, NJ",
"November 24, 2012",
"13,479",

ただし、すべての返品を削除したら、13,481〜1の範囲の番号の後に返品を挿入する必要があります。これは、CSVの各列が次のように名前、場所、日付、番号である必要があるためです。

"Shimshon A","(blank)","November 24, 2012","13,481"
"jonathan t","Laguna Niguel, CA","November 24, 2012","13,480"
"scott b","Sussex, NJ","November 24, 2012","13,479"
4

1 に答える 1

6

この問題に取り組むもう 1 つの方法は、データセットを 4 行のグループと見なすことです。

使用awk:

awk 'NR%4!=0 { printf "%s", $0; next } { sub(/,$/,"") }1' file

結果:

"Shimshon A","(blank)","November 24, 2012","13,481"
"jonathan t","Laguna Niguel, CA","November 24, 2012","13,480"
"scott b","Sussex, NJ","November 24, 2012","13,479"

説明:

ご覧のとおり、これはモジュラス演算子を使用して、正確に 4 で割り切れない (つまり、整数ではない) すべての行を「grep」します。「printf」ステートメントは、これらの行を並べて印刷します。'next' は成功するとスキップします。それ以外の場合は常に、遅れているコンマが削除され、行が出力されます (ステートメントの最後の 1 は、デフォルトで出力するための省略形です)。ご不明な点がございましたら、お気軽にお問い合わせください。HTH。

printfステートメントを変更するだけで、コンマと二重引用符の追加を統合することもできます。

awk 'NR%4!=0 { printf "\"%s\",", $0; next } { printf "\"%s\"\n", $0 }' file

使用GNU sed:

sed -n 'N;N;N;s/\n\|,$//g;p' file

または、コンマと二重引用符を追加する前に:

sed -n 'N;N;N;s/^\|$/"/g;s/\n/","/g;p' file

結果:

"Shimshon A","(blank)","November 24, 2012","13,481"
"jonathan t","Laguna Niguel, CA","November 24, 2012","13,480"
"scott b","Sussex, NJ","November 24, 2012","13,479"

説明:

awkこのソリューションははるかに短いですが、上記のを使用して説明したのと同じ感情を持っています。最初のステートメント:フラグsedを使用してデフォルトの印刷を無効にします。-nパターン スペースに 3 行を追加します。4 行目で、改行文字と末尾のカンマを削除します。次に、印刷します。

2 番目のsedステートメントはほとんど同じです。パターン スペースに 3 行を追加します。4 行目で、行の最初と最後を二重引用符に置き換えます。また、改行文字を二重引用符、コンマ、二重引用符に置き換えます。グローバルに。次に、印刷します。HTH。


コメントから:

私の経験から、awk(可能ではありますが) を使用して並べ替えると、すぐに読みにくくなる可能性があります。paste他の 2 つのツールを使用して記述した以前のコードの一部を再利用できる方法を次に示しますsort

paste <(awk -F, 'NR%4==2 { print $NF }' file) <(awk 'NR%4!=0 { printf "\"%s\",", $0; next } { printf "\"%s\"\n", $0 }' file) | sort | sed 's/[^"]*//'

このコマンドは、コンマと二重引用符を追加する前の入力を使用することに注意してください。ご覧のとおり、awk上記の 2 番目のコマンドを使用しています。paste以前に取得した各結果の前に「状態」を(で) 貼り付けることで機能します。これにより、行を を使用してアルファベット順に並べ替えることができますsort。入力がソートされると、sedこの情報を取り除くために使用されます。

于 2012-11-25T03:15:54.150 に答える