0

我有这样的文字:

characters      value ∆delta     

ABCDEABCDE      -3.663  [analyze]
EFGHEFGHEF      -1.937  [analyze]
IJKLIJKLIJ      2.137   [analyze]

我想提取数值

我用谷歌搜索了 regexp 并想出了这个 perl 单线

perl -p -i -e 's/[^0-9-.]//g' file.txt

这对你来说一定看起来非常糟糕,但在这种情况下它似乎对我有用。唯一的问题是,文本文件现在看起来像

-3.663-1.9372.137

但我希望它看起来像

-3.663
-1.937
2.137

如何在此正则表达式的每个匹配项之间插入新行?

谢谢!

4

6 回答 6

1

您需要将换行符添加到您的角色类

perl -p -i -e 's/[^0-9-.\n]//g' file.txt

这不会“添加”换行符,而是保留现有的换行符。还有其他方法可以基于列而不是正则表达式来完成此操作。

awk:

awk '{print $2}' file.txt > tmpfile.txt && mv tmpfile.txt file.txt

重击/嘘:

while read -r _ data _; do
   echo "$data"
done < file.txt > tmpfile.txt
mv tmpfile.txt file.txt
于 2012-06-26T22:09:16.413 回答
1

你应该没问题:

perl -p -i -e 's/[^-\d.\n\r]+//g' file.txt

你也可以试试:

perl -p -i -e 's/[^-\d.]*(\-?[\d\.]+)[^-\d.]*/$1\n/g' file.txt 

或者,如果您的文本可能包含.-不包含数字(例如ABC-DEF.GHI -3.663 [analyze]),则:

perl -p -i -e 's/(?:[^-\d.]+|\-(?!\d)|\.(?!\d))*(\-?(?:\d?\.?\d+|\d+\.?\d*))(?:[^-\d.]+|\-(?!\d)|\.(?!\d))*/$1\n/g' file.txt 
于 2012-06-26T22:10:34.743 回答
1

您有制表符分隔的数据,所以让我们利用它来获得最佳结果。

perl -i -F\\t -lanE'BEGIN { <>; <>; } say $F[2]' file.txt

如果您的数据只是空格分隔,我建议

perl -i -lanE'BEGIN { <>; <>; } say $F[2]' file.txt
于 2012-06-26T22:35:36.340 回答
0

解决您的问题的“简单”解决方案是使用该-l选项,它将为您处理行尾。在您的情况下,它将使用该-p选项为您的打印添加换行符。

perl -pi -le 's/[^0-9-.]//g' file.txt

但是,此解决方案是破坏性的,因为输入文件被破坏,并且假定文件中不存在其他数字、破折号和句点。后者很容易损坏您的数据。

在我看来,ikegami 在制表符或空格上拆分的解决方案是最好的。但是,您也可以使用正则表达式提取完整的数字:

perl -nlwe 'print /(-?[\d.]+)/' file.txt

这将提取由数字和句点组成的第一个字符串,并带有可选的前导破折号。如果要将输出保存到文件中,只需将其重定向

perl -nlwe 'print /(-?[\d.]+)/' file.txt > output.txt
于 2012-06-26T22:59:58.923 回答
0

您的解决方案将如何运作?- 我只-pe改为-lpe

 perl -i -lpe 's/[^0-9.-]//g' file.txt

这可以缩短为:

 perl -i -lpe's/[^--9]//g' file.txt

问候

rbo

于 2012-06-26T22:53:09.157 回答
0

感谢所有的答复。脚本在数字之间插入了一个新行,但没有删除文档中的空行(例如,我的第一个示例文本文件中的一个空行)。至少这就是我的测试文本文件的结果。我用谷歌搜索了如何删除空行,虽然我无法合并它,但我现在使用两个单行得到我想要的

perl -i -lpe's/[^--9]//g' file .txt
perl -pi -e "s/^\n//" file .txt
于 2012-06-27T19:17:37.673 回答