-3

我有一个这样的文件。我使用 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 上制作的。谢谢

4

2 回答 2

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. 我们将输入文件的内容通过管道(使用)管道到sed正则表达式中,该表达式只提取第一个数字并忽略其他所有内容:| cat input | sed -r 's/ *([0-9]+).*/\1/'

    • 它需要在任何空格或无空格之后可以找到的任何数字*(因为当我复制它时该示例有一些)
    • ([0-9]+)
    • 后面可能跟其他任何东西.*
    • 并用它的 find 替换完整的字符串,这就是s/input/replace/构造的内容

    这将使您获得以下结果:

    1345345 1345 13445 1345345 15345 145 45 15

  2. 您希望对此数据执行操作:为此,您通常需要使用一些编程语言,例如pythonperlruby​​ 或其他任何适合您需要的语言。(有些事情你的 shell 会为你做的很好),我在这里使用了 perl,这让我们| xargs perl -e 'for($c=0;$c<=$#ARGV;$c++) {print ($ARGV[$c] . ": " . $ARGV[$c] * 3 . "\n");}'

    • 所以我们再次通过管道将数据传递给我们的下一个命令|
    • 要将前一个管道的输出作为参数发送到另一个程序,我们使用xargs,就像在命令前面加上
    • 接下来在您的程序中循环(for($c=0;$c<=$#ARGV;$c++) { ... }通过提供的命令行参数,执行您的操作(这里我们执行 * 3)并打印结果(print ($ARGV[$c] . ": " . $ARGV[$c] * 3 . "\n");)。
  3. 获得数据后,将其重定向到新文件,此处尚未完成

或者,您也可以使用grep或许多其他程序,这就是 *nix 的美妙之处,它有很多工具。但是,您正在寻找的基本概念是过滤数据,对其进行处理并再次将其吐出。

于 2012-11-10T12:35:32.577 回答
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
于 2012-11-10T21:30:04.523 回答