我是正则表达式和处理文本的初学者。我需要做的是将文件中的文本格式化为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
排序(尽管可能)可能会变得很难快速阅读。这里有一种方法可以让您重用我们使用另外两个工具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
来去除这些信息。