我怎么能删除字符串并使用它前面的数字

时间:2012-11-10 11:47:26

标签: linux bash ubuntu

我有一个这样的文件。我使用Ubuntu和终端。

 1345345 dfgdfg
 1345 dfgdfg
 13445 dfgdfg
 1345345 ddfg
 15345 df
 145 dfgdfg
 45 dfgdfg
 15 dfgdfg

我想创建一个脚本,我可以删除字符串并除以数字或乘以这样的数字并打印附近的结果

 1345345 *3  or /3 result = 
 1345 *3 or /3
 13445 *3 or /3
 1345345 *3 or /3
 15345 *3  or /3
 145 *3 or /3
 45 *3  or /3
 15 *3  or /3

这是针对包含50个或更多条目的文件,然后将其输出到新文本文件中 所有这些我都是在Ubuntu上制作的。 谢谢

2 个答案:

答案 0 :(得分:1)

一个非常基本的例子是这样的:

cat input | sed -r 's/ *([0-9]+).*/\1/' | xargs perl -e 'for($c=0;$c<=$#ARGV;$c++) {print ($ARGV[$c] . ": " . $ARGV[$c] * 3 . "\n");}'

(输入是包含数据的文件)

给出:

1345345: 4036035
1345: 4035
13445: 40335
1345345: 4036035
15345: 46035
145: 435
45: 135
15: 45

毫无疑问,你需要更多地充实它以满足你的完整目的,但这应该是乐趣的一部分

所以让我们把它分解。

  1. 我们pipe(使用|)将输入文件的内容转换为sed regular expression,只提取第一个数字并忽略其他所有内容:{ {1}}

    • 它可以在任何空格cat input | sed -r 's/ *([0-9]+).*/\1/'之后找到它可以找到的任何数字(因为我复制它的例子有一些)
    • *
    • 可能会跟随其他任何内容([0-9]+)
    • 并将完整字符串替换为.*构造所关注的查找

    这将使您获得以下结果:

    s/input/replace/

  2. 您希望对此数据执行操作:为此,您需要使用一般编程语言,例如pythonperlruby或其他任何适合的语言您的需求。 (有些东西你的shell会对你很好),我在这里使用perl会让我们感到1345345 1345 13445 1345345 15345 145 45 15

    • 因此,我们再次使用| xargs perl -e 'for($c=0;$c<=$#ARGV;$c++) {print ($ARGV[$c] . ": " . $ARGV[$c] * 3 . "\n");}'
    • 将数据传输到下一个命令
    • 将输出从前一个管道发送到另一个程序作为我们使用xargs的参数,它就像在
    • 之前添加命令一样简单
    • 你的程序中的下一个循环(|通过提供的命令行参数,执行你的行动(这里我们执行* 3)并打印出结果(for($c=0;$c<=$#ARGV;$c++) { ... })。
  3. 获得数据后,redirect将其转换为新文件,但尚未在此处完成

  4. 或者您也可以使用grep或许多其他程序,这是* nix的优点,它有许多工具。但是,您正在寻找的基本概念是filtering您的数据,处理它并再次吐出。

答案 1 :(得分:0)

使用 :(在此示例中,我不希望数字和字符串之间有空格)

perl -lne 's/\W//; print "$_ x 3 = ", $_ * 3' file.txt | tee newfile.txt

使用

awk '{print $1 " x 3 = " $1 * 3}' file.txt | tee newfile.txt

仅使用

 while read n x; do echo "$n x 3 = $((n * 3))"; done < file.txt | tee newfile.txt