使用BASH显示来自CSV的统一数字列表

问题描述:

我在Excel电子表格中发送了大量URL的列表,每个列表根据字符串中的某个获取变量进行唯一性设置(值的范围是5-7个数字长度)。我不得不根据这些数据在我们的数据库上运行一些查询,并且不想经过数百个条目逐个除去数字。 BASH命令可用于解析每行中的数字(它是每行中的唯一数字)并将其整合到一行,所有数字以逗号分隔?使用BASH显示来自CSV的统一数字列表

的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 

编辑:我的道歉,我没有注意到,在列表中有一半的方式,他们决定让小青蛙和改变周围的事物,有条目,当保存为CSV,某些行将显示为:

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

与其他几个条目看起来类似于上述任何行。 COMMENT可以与(大写)字符的单个字符串比每COMMENT

+0

你试图解析的例子可能会有所帮助。 – womble

+0

向我们展示了一些输入和一些预期的输出(合适的编辑)。 – Iain

假设变量总是在它自己的,与去年上线,大概只是采取一切是在=权怎么样?

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

编辑:好,用新信息,你必须编辑正则表达式位:

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

这里什么DocumentId或fDocumentId将被捕获后。适用于迄今为止提供的数据,至少。

+0

感谢您的编辑,这是完美的工作,并且是在一个不像Ctrl-C Ctr-V那么简单的环境中输入的最简单的解决方案。 – Scott

如果你没有完全致力于抨击长度为3个字符不再更换,瑞士军刀将帮助:

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

将所有内容剪切到(包括)=,然后将所有内容剪切到空格后,然后删除所有破折号。上述输入运行,返回

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

通常情况下,这不会是一个问题,但是使用perl v5.8.8,我得到''-bash-3.2 $ G'“''' – Scott

+0

的回报,我正在使用5.12.3,而且没有任何花哨你可以检查你的原始文件*真的*看起来像你发布的文件吗? – MadHatter

+0

刚刚在5.8.8上试过了,我得到的结果是一样的,你可能想用复制粘贴文本你张贴上面(不包括“...”的行) – MadHatter

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

+0

这不适用于新数据,并且不会使用逗号分隔 – carlpett

+1

至少在我的系统上,用空格而不是逗号分隔数字。自从'cut -d“=”-f 2 MadHatter

+0

呵呵,在发帖之前,我已经问过自己,如果我应该折磨这只可怜的猫,它会让我。感谢MadHatter – Razique