スクリプトによって自動的に生成されたcsvファイルがありますが、受信した特定のレコード(アイテム)の列2を検索し、値に「* .app」が含まれている場合は、列2に「INVALID」を印刷する必要があります。そして、セルを右に移動します。
データファイルの例:
DOM,PROJ,APP,USER,DATE,TIME,STATUS
www,test,biz.app,bob,6-1-18,09:33,OK //Example of good line
www,biz.app,tony,7-11-17,06:22,ok //Example of bad line
...
Wanted output:
DOM,PROJ,APP,USER,DATE,TIME,STATUS
www,test,biz.app,bob,6-1-18,09:33,OK
www,INVALID,biz.app,tony,7-11-17,06:22,ok //Example of fixed line
...
awk、sed、if文を試しましたが、成功しませんでしたが、必要な結果が得られませんでした。
e.g.
if [ awk -F',' '{ print $2 } < FILE' ] == "*.app" ; then ; echo "INVALID"; fi
これは間違いなく悪いことです...初めてbashに触れてくれてありがとう!
答え1
awk -F, -vOFS=, '$2 ~ /\.app$/ { for (i = NF + 1; i > 2; --i) $i = $(i-1); $2 = "INVALID" } 1' file >newfile
このnewfile
コマンドは、入力フィールドと出力フィールドの区切り文字をコンマに設定し、値の末尾にある文字列と一致する正規表現に基づいて2番目の列の値をテストしますfile
。テストが成功すると、レコード内のフィールドは右に1位置移動し、文字列を新しい2番目のフィールドにするためのスペースが確保されます。awk
.app
INVALID
尾は1
次のように置き換えることができます{ print }
(これによりすべての行が出力されます)。
与えられたサンプルデータの場合、出力ファイルには以下が含まれます。
DOM,PROJ,APP,USER,DATE,TIME,STATUS
www,test,biz.app,bob,6-1-18,09:33,OK
www,INVALID,biz.app,tony,7-11-17,06:22,ok
答え2
Awk
方法:
awk 'BEGIN{ FS = OFS = "," }NR > 1 && $2 ~ /.*\.app/{ $2 = "INVALID" OFS $2 }1' file
NR > 1 && $2 ~ /.*\.app/
- レコード番号が1
(最初を除くすべてのレコード)より大きく、2番目のフィールドがパターンと一致$2
する場合/.*\.app/
出力:
DOM,PROJ,APP,USER,DATE,TIME,STATUS
www,test,biz.app,bob,6-1-18,09:33,OK
www,INVALID,biz.app,tony,7-11-17,06:22,ok
答え3
このGNU sed
ツールを使用すると、次のようにこの問題を解決できます。
sed -e '
1!s/,/\n&/2
/\.app\n/s/,/,INVALID,/
s/\n//
' file.csv
読む:
° Only for lines that are not the first, meaning, skip the header from being considered for processing, whilst for the others, place a marker at the second occurrence of the comma.
° Any line that has the 2nd field terminating in a .app append the string INVALID after the first field.
° Now take away the marker.
° N. B. Lines whose 2nd field doesn't comprise *.app are passed on unmodified.