使用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
假设变量总是在它自己的,与去年上线,大概只是采取一切是在=
权怎么样?
sed -r "s/.*=([0-9]+)$/\1/" testdata | paste -sd","
编辑:好,用新信息,你必须编辑正则表达式位:
sed -r "s/.*f?DocumentId=([0-9]+).*/\1/" testdata | paste -sd","
这里什么DocumentId或fDocumentId将被捕获后。适用于迄今为止提供的数据,至少。
感谢您的编辑,这是完美的工作,并且是在一个不像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,
你试图解析的例子可能会有所帮助。 – womble
向我们展示了一些输入和一些预期的输出(合适的编辑)。 – Iain