sedは他のファイルから文字列を検索して置き換えます。

sedは他のファイルから文字列を検索して置き換えます。

sed / awkを1行の方法で使用して、次のbashスクリプトを作成する方法についてのアドバイスが必要です。または、代わりにPythonを使用できる場合は、この検索と置換操作を実行するのに最適です。

ここでは、"input.txt"というファイルに検索パターンを作成しました。ここで、最初の列は検索用で、2番目の列は置換用です。次に、各列の値を配列に割り当て、sedユーティリティを使用してforループを呼び出して「file.csv」を検索して置き換えました。この変更は、3番目の列でのみ発生します。

ファイル.csv

Symbol,Name,Value
*,yy03LN-1,LM-GA-G01
*,yy5310-4,YP-QL-A03
*,yy5310-5,YP-QL-A10

入力.txt

LM-GA-G01,LM-GA-G1
YP-QL-A03,YP-QL-A3
YP-QL-A10,YP-QL-A10

予想される結果は、「0」の数字の3番目の列を削除することです。

ファイル.csv

Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10

この状況に基づいて、よりうまく機能するシェルスクリプトを作成しましたが、これを行うには、1行または短いスクリプトなどの助けが必要です。

#!/bin/bash
post=$(cat file.csv|awk -F "," '{print $NF}'| grep -v Index)
postar=($post)

for (( i=0; i<${#postar[@]}; ++i )); do
grep "${postar[$i]}" input.txt >> filtered.txt
done

left=$(cat filtered.txt|awk -F "," '{print $1}')
leftar=($left)
right=$(cat filtered.txt|awk -F "," '{print $2}')
rightar=($right)


for (( i=0; i<${#leftar[@]}; ++i )); do
sed -i -e 's/'"${leftar[$i]}"'/'"${rightar[$i]}"'/g' file.csv
done

input.txt注: - 行数が異なりますfile.csv

提案してください

ありがとうJ

ベストアンサー1

以下はCSV認識ツールを使用しています。ミラーmlr)は、フィールド値に含まれるすべての数値のゼロ塗りつぶしを削除しますValue

$ mlr --csv put '$Value = gsub($Value, "([A-Z])0+([1-9])", "\1\2")' file
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10

この関数を使用すると、大文字()の後に表示される数字(繰り返し可能)とゼロ以外の数字()をValue一致させてフィールドを変更できます。gsub()これらの一致は、大文字とゼロ以外の数字で置き換えられ、整数を埋めるゼロ文字列を削除します。0[A-Z][1-9]

mlrこれらのオプションを使用して修正操作を実行できます-I

おすすめ記事