csvファイルから2列の値を取得し、値がある場合は「無効」を挿入してセルを右に移動します。

csvファイルから2列の値を取得し、値がある場合は「無効」を挿入してセルを右に移動します。

スクリプトによって自動的に生成された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.appINVALID

尾は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.

関連情報