入力ファイルを使用してスクリプトで変更されたファイル -
141,141_1,bar,honda,ps2_0,割り当てられていない,ps3_0,割り当てられていない,ps4_0,割り当てられていない,ps5_0,割り当てられていない,ps6_0,割り当てられていない,ps7_3,until,will,.....
入力ファイル -
141. PS7、ティルウェル
これで、ps7_3列が正しい値に更新されていることを検索する必要があります。
だから、入力ファイルから列を分離しました。
while read -r line;
do
sub1=$(echo $line|cut -f 1 -d ',');
sub2=$(echo $line|cut -f 2 -d ',');
sub3=$(echo $line|cut -f 3 -d ',');
sub4=$(echo $sub2'.*,'$sub3|sed -e "s/\(.*\)\r/'\1'/");
echo $sub1;
echo $sub2;
echo $sub3;
echo $sub4;
grep $sub4 modded_file.csv.dat;
done<input.csv
出力は -
141
ps7
TILL WILL
'ps7.*,TILL WILL'
grep: WILL': No such file or directory
しかし、実行すると grep 'ps7.*,TILL WILL' modded_file.csv.dat
動作します。上記のような変数をファイルにどのようにgrepしますか?
答え1
入力が示すように、変数sub4にスペース記号があるので、次の行を書き直します。
grep $sub4 modded_file.csv.dat;
~になる
grep -- "$sub4" modded_file.csv.dat;
(@philipposが追加しました)
そして一重引用符は検索パターンの一部と見なされるため、$sub4
含めないでください。'
私はあなたの誤解が引用と拡張が行われる順序だと思います。変数は最初に拡張され、次に引用されるので、拡張後に変数の一重引用符が文字列を引用すると思います。しかし、実際には引用は変数拡張の前に行われるため、引用が必要です。$sub
答え2
grep
ループ内で実行するのは巨大なアンチパターンです。この試み。
awk -F "," 'NR==FNR { key[$1]=$2; value[$1]=$3; next }
($1 in key) && ($0 !~ "^" $1 ",.*," key[$1] "," value[$1] ",")' input.csv modded_file.csv.dat
\r
私はなぜあなたが特定の方法でそこにいることを望むか期待するのかを理解しようとしません。
Awkスクリプトは、各入力行に順番に適用される一連の*条件付きアクションペアで{
構成されています。この入力行をスキップして次の入力にジャンプする残りのスクリプトを}
使用でき、省略できます。next
{
行動}
完全な入力行を印刷する場合。 (略してもいいです。状況 何かを無条件にしたいなら。 )各行は、スクリプト内で $1
次のように使用できるフィールドに分かれています。フィールド区切り文字をコンマに設定します(デフォルトは一連のスペースです)。$2
-F ","
このNR==FNR
イディオムは、Awkで2つの入力ファイルを処理する一般的な方法です。最初の入力ファイルを処理すると、合計行番号はNR
ファイル内の行番号と同じで、その後はfalseになります。FNR
最初のファイルを読み込むときに、2 つの連想配列にフィールドを保存します。どちらも最初のフィールドをキーとして使用します。
2番目のファイルを読み取ると、配列内のキーが見つかった各入力行を印刷し、行全体が予想される正規表現key
と一致しません(最初のフィールドはキーで、その後に何も来て、その後にカンマ、列に保存する名前key[$1]
、別のコンマ、 に保存する期待値value[$1]
、別のコンマ)。
つまり、予想される条件を満たさない行を探します。!
マッチしたい場合は取り出してください。