0

ファイル入力A.txtの 1 つの列のエントリを、対応する順序でB.txtで指定されたリストに置き換えたい

例えば

A.txtタブ区切りですが、列の値はコンマで区切られているため、その列の値のエントリの 1 つを変更する必要があります。P=

1 X y Z Q=Alpha,P=beta,O=Theta
2 x a b Q=Alpha,P=beta,O=Theta
3 y b c Q=Alpha,P=beta,O=Theta
4 a b c Q=Alpha,P=beta,O=Theta
5 x y z Q=Alpha,P=beta,O=Theta

B.txt

1 gamma
2 alpha
3 alpha
4 gamma
5 alpha

A.txt の各エントリを読み取り、B.txtP=の対応する行の値に置き換えます

出力:

1 X y Z Q=Alpha,P=gamma,O=Theta
2 x a b Q=Alpha,P=alpha,O=Theta
3 y b c Q=Alpha,P=alpha,O=Theta
4 a b c Q=Alpha,P=gamma,O=Theta
5 x y z Q=Alpha,P=alpha,O=Theta

前もって感謝します!!!

4

3 に答える 3

1

A.txt と B.txt が最初の列で並べ替えられていると仮定すると、最初にjoin両方のファイルを作成してから、次を使用して指定したフィールド内で置換を実行できますsed

例えば:

join -t $'\t' -j 1 A.txt B.txt | sed 's/,P=.*,\(.*\)\t\(.*\)/,P=\2,\1/g'
于 2012-10-03T15:42:03.043 に答える
1

sed で sed スクリプトを作成できます。たとえば、次のようになります。

sed 's:^:/^:; s: :\\b/s/P=[^,]+/P=:; s:$:/:' B.txt

出力:

/^1\b/s/P=[^,]+/P=gamma/
/^2\b/s/P=[^,]+/P=alpha/
/^3\b/s/P=[^,]+/P=alpha/
/^4\b/s/P=[^,]+/P=gamma/
/^5\b/s/P=[^,]+/P=alpha/

それを 2 番目の sed にパイプします。

sed 's:^:/^:; s: :\\b/s/P=[^,]+/P=:; s:$:/:' B.txt | sed -r -f - A.txt

出力:

1 X y Z Q=Alpha,P=gamma,O=Theta
2 x a b Q=Alpha,P=alpha,O=Theta
3 y b c Q=Alpha,P=alpha,O=Theta
4 a b c Q=Alpha,P=gamma,O=Theta
5 x y z Q=Alpha,P=alpha,O=Theta
于 2012-10-03T17:19:09.350 に答える
0

別の解決策:

awk '{getline b < "B.txt" split(b, a, FS)} -F "," {sub(/beta/, a[2]); print}' A.txt
于 2012-10-05T17:22:03.657 に答える