シェルスクリプトを使用したファイルの編集

シェルスクリプトを使用したファイルの編集

私は、埋め込まれたテキストファイルに含める必要がある計算を実行するスクリプトを開発しています。ファイル行の形式は次のとおりです。

1 20/10/16 12:00 take car in the garage joe's garage

スクリプトは、行の最初の数字を置き換える計算から数字を取得します。たとえば、「calculate」は値15を返すと、スクリプトは問題のあるファイルにアクセスし、問題のある行を次のように変更する必要があります。

15 20/10/16 12:00 take car in the garage joe's garage

要点は、この変更を行う方法がわからないことです。 bash、awk、sed、または利用可能なリソースに存在できます。ありがとうございます。

答え1

どうですか?

awk -v old=$oldNum -v new=$newNum \
'{if ($1==old) {$1=new; print} else {print}}' input.txt > output.txt

次のように試しました。

$ cat input.txt
2 19/10/16 15:30 some other line
1 20/10/16 12:00 take car in the garage joe's garage
3 17/10/16 5:30 another one

$ oldNum=2
$ newNum=15

awkコマンドを実行したら、次のようにします。

$ cat output.txt
15 19/10/16 15:30 some other line
1 20/10/16 12:00 take car in the garage joe's garage
3 17/10/16 5:30 another one

これはあなたが望むものですか?結果を元のファイルに表示するには、入力ファイルを上書きするmv新しい名前の出力ファイルだけが必要です(コマンドエイリアスを防ぐにはバックスラッシュを使用してください)。input.txt\mvmv

注:短いawk命令を使用しても同じ結果が得られますが、この構文を使用すると読みやすくなります。sedおそらくこれはより簡潔な方法で行うことができます。


編集:ファイル内の1つの数字のみを変更したい場合は、これが機能することに気づきました。質問を正しく理解したら、数字を再計算したいすべて行を作成し、これらの新しい番号でファイルを作成します。これを行う最善の方法は、新しい行番号の計算を含めることです。~へ、、...などのツールを繰り返し呼び出すことは、最終的に費用がかかる可能性があるawkため、一般的に悪い考えです。次のことができます。awkechosed

if [ -f $PWD/output.txt ]; then 
    # Remove old output if present in current directory
    \rm -f $PWD/output.txt
fi

awk '{ ###calculation here, result store in newNum###; $1=newNum; print}' input.txt > output.txt

たとえば、単に各行番号を1ずつ増やすには、次のようにします。

awk '{$1++; print}' input.txt > output.txt

で計算をラップできないか、あえてできない場合は、ファイルに対してawkループを実行できますが、bashスクリプトの私の理解によると、これは非常に不器用です。

if [ -f $PWD/output.txt ]; then 
    # Remove old output if present in current directory
    \rm -f $PWD/output.txt
fi

while read line
do
    newNum=###Calculation here for current line###
    echo $line | awk -v new=$newNum '$1=new' >> output.txt
done <input.txt

答え2

この試み..

awk -v num="$variable" '{$1=num}1' input.txt

答え3

以下は、目的のタスクを実行する短いPythonスクリプトです。使い方は簡単です。ファイル、行の先頭の番号、見たい番号を指定します。

デモ:

    bash-4.3$ 猫 data.txt
    2 16/10/19 15:30 他の路線
    1 2016年10月20日12時にガレージジョーのガレージから車を買収しました。
    3 2016年10月17日 5:30 もう一つ
    bash-4.3$ python renumber.py data.txt 1 15
    ['renumber.py', 'data.txt', '1', '15']
    bash-4.3$ 猫 data.txt
    2 16/10/19 15:30 他の路線
    2016年10月20日12:00 Joe's Garageガレージで車をピックアップします。
    3 2016年10月17日 5:30 もう一つ

パスワード:

import sys
import os

print(sys.argv)

with open(sys.argv[1]) as inputfile:
    with open('/tmp/temp.text','w') as tempfile:
         for line in inputfile:
             old = line.strip().split()
             if old[0] == sys.argv[2]:
                old[0] = sys.argv[3] 
                line = ' '.join(old) + '\n' 
             tempfile.write(line)

os.rename('/tmp/temp.text',sys.argv[1])

関連情報