2

特定のフィールドまたはフィールド セットの MD5 ハッシュを必要とするパイプ区切りのテキスト ファイルがあります。私は AIX を使用しており、csum 関数を使用する必要があるため、単純にファイルとハッシュ関数を awk に渡して一気に実行することはできないと思います。

そのため、各行を読み取り、ハッシュされるフィールドを csum に渡し、gsub を介して置換として結果をドロップするスクリプトを作成しています。99% の場合は問題なく動作しているように見えますが、gsub が本来あるべきではないものを置き換えたため、何かがうまくいかないことがあります。

#!/bin/ksh
rm $2 #Get rid of output file
while read line; do #loop through each line
MYFIELD=$(echo "$line" | cut -d "|" -f 6); #push the 6th field into a var
MYHASH=$(echo $MYFIELD | csum -h MD5 -); #csum will hash a string only on the stdin
echo $line | sed -e "s/$MYFIELD/${MYHASH}/g" >> $2 #gsub replaces, but not always what we want
done < $1 #read in the input file

代わりに awk を使用してフィールドを更新できると思います。しかし、一度に1行ずつ行う方法は私にはわかりません。理想的には、2 つの必須パラメーター (infile と outfile) を渡してから、ハッシュして置換する任意の数のフィールド位置を渡すことができるスクリプトが必要です。あら

foo infile.txt outfile.txt 2 6 12

infile.txt を読み取り、フィールド 2、6、および 12 をハッシュし、outfile.txt に書き出します。あなたの提案は大歓迎です

4

1 に答える 1

3

でそれを行うのはawkどうですか?

それ以外の

echo $line | sed -e "s/$MYFIELD/${MYHASH}/g" >> $2 #gsub replaces, but not always what we want

使用できます

old=$MYFIELD; new=$MYHASH; echo $line | awk -F"|" -v o="$old" -v n="$new" '{OFS=FS} sub(o, n, $6) {print}' >> $2

基本的に私たちがしていることは次のとおりです。

  • old=$MYFIELD; new=$MYHASHに送信するパラメータを割り当てますawk
  • echo $lineawk が取得できるように行を出力します。

awk では、

  • -F"|"|フィールド区切りとして 定義します。
  • -v o="$old"-v n="$new"awk で変数を操作し、それぞれに名前$old$new付けます。 on
  • {OFS=FS}- フィールド間の区切り文字を定義します。である可能性もありますがOFS="|"、このようにawkして、 で定義したものと同じものを使用することを示します-F="|"。変更された場合に備えて、フィールドセパレーターを保持する方がより柔軟です。
  • sub(o, n, $6)o変数のテキスト(つまり$MYFIELD) を変数のテキスト (vつまり ) に置き換えますが、$MYHASHフィールド6だけです
  • print置換テキストを含む行全体

これは、あなたがコメントに与えた例で私にとってはうまくいきました:

old="hashit"; new="WE_DID"; echo "donthashit|foo1|bar1|foo2|bar2|hashit" | awk -F"|" -v o="$old" -v n="$new" '{OFS=FS} sub(o,n,$6) {print}'
donthashit|foo1|bar1|foo2|bar2|WE_DID

それが役に立てば幸い。

編集変数をawkに簡単に渡す方法
見つけました:-v o=${variable_name}

このようにして、解決策は次のようになります。

echo $line | awk -F"|" -v o=${MYFIELD} -v n=${MYHASH} '{OFS=FS} sub(o, n, $6) {print}' >> $2
于 2013-03-16T20:11:09.793 に答える