sedまたはawkベースの実行コマンドを使用して特定の行を置き換える方法

sedまたはawkベースの実行コマンドを使用して特定の行を置き換える方法

次のCSVファイルがあります。

site1.com,aaa,bbb,ccc
site2.com,qqq
site3.com,rrr,uuu,ppp
site4.com
site5.com,ddd,sss

行(行)を空の4番目の列に変更したいと思います。私はコマンドを実行してこの行を操作したいと思います。たとえば、次のようにしますawk

awk -F, '$4=="" {system("$1,cmd1 $1")}' test.csv

次に、次のようにエクスポートしたいと思います(output1はcmd1コマンドの出力です)。

site1.com,aaa,bbb,ccc
site2.com,output1
site3.com,rrr,uuu,ppp
site4.com,output1
site5.com,output1

答え1

awk -F, -v q=\' '
  function shellquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  $4 == "" {
    printf "%s,", $1
    system("cmd " shellquote($1))
    next
  }
  {print}'

このshellquote部分が重要です。たとえば、$1値が似ている場合を考えてみましょう。;reboot

答え2

awk -F, '{ if ( $4 == "" ){printf "%s,",$1 ; system(CMD) ;}else {print $0}}' test.csv

4番目のフィールドが空の場合は最初のフィールドとコマンド出力を印刷し、それ以外の場合は穴のラインを印刷します。

ただし、コマンドの出力がどのように印刷されるかを参照してください。

答え3

次のコードを使用できます。

awk -v output1="$(cmd1)" 'BEGIN{FS=OFS=","} NF&&NF<4{print $1,output1}1' file

このオプションは-v変数をoutput1シェルコマンドの結果に設定しますcmd1

このステートメントはBEGIN{FS=OFS=","}区切り文字をコンマに設定します。

行が空でなく、フィールド数が4つ未満の場合は、行を置き換えます。

最後に、1デフォルトステートメントが実行されますawk。行全体を印刷します。

答え4

sed -rn '
/\S+,\S+,\S+,\S+/{p;b}      # if all four columns exist, print and branch to end
s/^([^,]+).*/\1/            # else extract first column
h                           # hold
s/.*/echo output &/e        # exeute external command echo with first column as argument
G                           # append previous hold value
s/(.*)\n(.*)/\2,\1/         # arrange position
p' file                     # print result

関連情報