シェルスクリプトでファイルを編集する

シェルスクリプトでファイルを編集する

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

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

スクリプト内では計算から数値を取得し、その数値が行の最初の数値に置き換えられます。たとえば、「計算」が値 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では、シェル ループを作成する必要がありません。これはawk、、、 ...echoなどのツールをsed繰り返し呼び出すと非常にコストがかかるため、一般的には悪い考えです。次のようにすることができます。

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$ cat データ.txt
    2 19/10/16 15:30 その他
    1 20/10/16 12:00 ガレージジョーのガレージに車を持ち込む
    3 17/10/16 5:30 もう1つ
    bash-4.3$ python renumber.py data.txt 1 15
    ['renumber.py', 'data.txt', '1', '15']
    bash-4.3$ cat データ.txt
    2 19/10/16 15:30 その他
    15 20/10/16 12:00 ガレージジョーのガレージに車を持ち込む
    3 17/10/16 5:30 もう1つ

コード:

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])

関連情報