-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]+)
    • 他の何かが続く可能性があります.*
    • そして、完全な文字列を検索結果に置き換えます。それがs/input/replace/構造の目的です

    これにより、次の結果が得られます。

    1345345 1345 13445 1345345 15345 145 45 15

  2. このデータに対して操作を実行したい場合: これには、pythonperlruby​​ など、ニーズに合ったプログラミング言語を使用する必要があります。(あなたのシェルがあなたのためにうまくやってくれるいくつかのこと)、私はここで私たちを生む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 に答える