使用sed或或其他文本处理器-查找/替换某个范围内的数字



我是正则表达式和处理文本的初学者。我需要做的是将文件中的文本格式化为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

我在带有find/replace:的文本编辑器中添加了行尾逗号和行首/行尾引号

"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",

但是,一旦我删除了所有返回值,我就需要在13481到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"

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

使用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排序(尽管可能)可能会变得很难快速阅读。这里有一种方法可以让您重用我们使用另外两个工具pastesort:编写的一些以前的代码

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来去除这些信息。

最新更新