2017-02-02 17 views
0

私はレイアウトでテキストファイルを持っている:私はいくつかの他の変数とのcounterVariable1を交換したい検索AとでBを交換|として、シェルスクリプト/ SED/AWKでB

tableName1|counterVariable1 
tableName2|counterVariable2 

はcounterVariableNewを言います。

どうすればこの問題を解決できますか?

私が最も近いものを下に記載され、様々なSED/AWKのアプローチを試してみました:

cat $fileName | grep -w $tableName | sed -i 's/$tableName\|counterVariable/$tableName\|counterVariableNew' 

しかし、すべての3つのコマンドが正常にマージされていない、助けてください!

答えて

1
awk -F'|' -v OFS='|' '/tableName1/ {$2="counterVariableNew"}1' file 
tableName1|counterVariableNew 
tableName2|counterVariable2 

これはA (tableName1)を検索し、counterVariableNewB (counterVariable1)に置き換えられます。

またはsedを使用して:単語囲まれた検索のために

sed -r '/tableName1/ s/(^.*\|)(.*)/\1counterVariableNew/g' file 
tableName1|counterVariableNew 
tableName2|counterVariable2 

\<\>内のパターンを囲みます。

sed -r '/\<tableName1\>/ s/(^.*\|)(.*)/\1counterVariableNew/g' file 
awk -F'|' -v OFS='|' '/\<tableName1\>/ {$2="counterVariableNew"}1' file 
+0

クイックレスポンスありがとうございますが、両方のコマンドがtableName1 *を検索していますが、代わりにtableNameだけを検索する必要があります。 例えば.. tableName1 | counterVariable1 tableName2 | counterVariable2 tableName11 | counterVariable11 あなたは上記の回答でtableName1 –

+0

チェックアップデートを交換しようとするでしょうときtableName11が置き換えられます。 –

+1

PSに感謝します。それは完璧に働いた!それを理解するには時間が必要です。:p –

2

スクリプトは[ useless use of cat ]の例です。しかし、ここでのポイントは、awk FSと一緒に使用すると、特別な意味を持つパイプ区切り文字から逃げることです(ORを意味します)。そこで、以下のスクリプトは同じものを行うための別の方法

# cat 42000479 
tableName1|counterVariable1 
tableName2|counterVariable2 
tableName3|counterVariable2 

# awk -F\| '$1=="tableName2"{$2="counterVariableNew"}1' 42000479 
tableName1|counterVariable1 
tableName2 counterVariableNew 
tableName3|counterVariable2 

を行う必要があります下に展開されることはありません単一引用符内の

# awk -v FS='|' '$1=="tableName2"{$2="counterVariableNew"}1' 42000479 

ものです。

+1

これは正しいアプローチですが、OFSも設定することを忘れないでください。awk BEGIN {FS = OFS = "|"} $ 1 == "tableName1" {$ 2 = "counterVariableNew"} 1 'file'。最初のケースではawkに 'または'を意味するので、 '|'をエスケープしていません。これはシェルで 'pipe'を表しているからです。それをシェルから隠すために引用するだけです。 –

+1

@エドモートン、コメントの後半部分をありがとう、本当にありがとう。 :) – sjsam

関連する問題