使用BASH显示CSV中的合并数字列表

时间:2011-08-23 11:16:00

标签: bash regex

我在Excel电子表格中发送了一个大的URL列表,每个URL都根据字符串中的某个get变量而唯一(其值是5-7个数字的长度)。我不得不根据这些数字在我们的数据库上运行一些查询,并且不想经历数百个逐个清除数字的条目。什么BASH命令可用于解析每一行中的数字(它是每行中唯一的数字)并将其合并为包含所有数字的一行,逗号分隔?

CVS电子表格的示例(缩短)列表包括:

http://www.domain.com/view.php?fDocumentId=123456
http://www.domain.com/view.php?fDocumentId=223456
http://www.domain.com/view.php?fDocumentId=323456
http://www.domain.com/view.php?fDocumentId=423456
DocumentId=523456
DocumentId=623456
DocumentId=723456
DocumentId=823456
....
...

格式的更改是有意的,因为他们决定在几行之后将其简化为变量名称和值。 get变量从fDocumentId更改为DocumentId也是故意的。理想输出看起来类似于:

123456,23456,323456,423456,523456,623456,723456,823456
编辑:道歉,我没有注意到列表的一半,他们决定变得邋and并改变一切,有条目保存为CSV时,某些行将显示为:

"DocumentId=098765 COMMENT, COMMENT"
DocumentId=898765 COMMENT
DocumentId=798765- COMMENT
"DocumentId=698765- COMMENT, COMMENT"

其他几个条目与上述任何行类似。 COMMENT可以替换为每个COMMENT长度不超过3个字符的单个字符串(大写)字符

3 个答案:

答案 0 :(得分:2)

假设变量总是在它自己上面,并且最后在线上,那么只需要取=右侧的任何内容?

sed -r "s/.*=([0-9]+)$/\1/" testdata | paste -sd","

编辑:好的,有了这些新信息,您将需要编辑一下正则表达式:

sed -r "s/.*f?DocumentId=([0-9]+).*/\1/" testdata | paste -sd","

将捕获DocumentId或fDocumentId之后的任何内容。适用于您目前所提供的数据,至少。

答案 1 :(得分:1)

比这更简单:) cat file.csv | cut -d“=” - f 2 | xargs的

答案 2 :(得分:0)

如果你没有完全致力于打击,瑞士陆军电锯将提供帮助:

perl -ne '{$_=~s/.*=//; $_=~s/ .*//; $_=~s/-//; chomp $_ ; print "$_," }'  < YOUR_ORIGINAL_FILE

这会削减所有内容,包括=,然后是空格后的所有内容,然后删除任何破折号。运行上面的输入,它返回

123456,223456,323456,423456,523456,623456,723456,823456,098765,898765,798765,698765,