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

解决此问题的另一种方法是将您的数据集视为四行组

使用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"

解释:

正如你所看到的,这使用模数运算符来“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将三行附加到模式空间。在第四行,删除换行符和滞后逗号。然后打印。

第二个sed陈述大致相同;将三行附加到模式空间。在第四行,用双引号替换行的开头和结尾。还用双引号、逗号、双引号替换换行符;全球范围内。然后打印。HTH。


从评论:

根据我的经验,使用(尽管可能)进行排序awk可能会很快变得难以阅读。这是一种让您重用我们使用其他两个工具编写的以前代码的方法,paste并且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上面描述的第二个命令。它通过paste在我们之前获得的每个结果之前粘贴(用)“状态”来工作。然后,这允许使用 . 按字母顺序对行进行排序sort。输入排序后,sed用于剥离此信息。

于 2012-11-25T03:15:54.150 回答