awkプログラムでファイル名の一部としてエクスポートされた変数を使用する

awkプログラムでファイル名の一部としてエクスポートされた変数を使用する

私は自分のプロフィールに1つを設定export X25DATAF=/home/Bob/X25/Datafilesし、これが私がやっていることですecho $X25DATAF

/home/Bob/X25/Datafiles以下の内容をプログラムの2つの場所に変更したいと思います。ただし、動作させることはできません(例:)。そうすれば、私がしなければならないのは、このプログラムを実行しているシステム(および他の同様のプログラム)のパスへのパスを設定することだけです。awk$X25DATAFawk$X25DATAF/ALL_SW_DB.txtexportawk

awk -F"\t" ' 
FILENAME=="Sites1" {
  cllina[$0]=$0
}
FILENAME=="/home/bob/X25/DataFiles/ALL_SW_DB.txt" {
  swclli=hostclli=""
  swclli=substr($7,1,8)
  hostclli=substr($3,1,8)
  fclli[hostclli]++
  fclli[swclli]++

  if(hostclli==cllina[hostclli]) {
    if(swclli!=hostclli) {
      printf"REM|%s|%s|%s|%s|%s|%s|%s|%s|%s-%s\n",hostclli,$4,$3,$6,$9,$7,$12,$13,$5,$14 >>"host_remote"
    }
   }

  if(swclli==cllina[swclli]) {
      printf"HOST|%s|%s|%s|%s|%s|%s|%s|%s|%s-%s\n",swclli,$4,$3,$6,$9,$7,$12,$13,$5,$14 >>"host_remote"
    }
 }
 END{
  for(x in cllina)
    if(fclli[x]=="") printf"%s\n",x >"site1.err"
}' Sites1 /home/bob/X25/DataFiles/ALL_SW_DB.txt

答え1

通常どおり、構文FNR==NR(ファイル行番号は完全行番号と同じ)が最初のファイルに使用され、2番目のファイルnextディレクティブの操作をスキップします。

awk -F'\t' -v OFS='|' '
    FNR==NR{
        cllina[$0]=1
        next
    }
    {
        swclli=hostclli=""
        fclli[swclli]++
    }
    cllina[hostclli] && swclli!=hostclli{
        print "REM",hostclli,$4,$3,$6,$9,$7,$12,$13,$5,$14
    }
    cllina[swclli]{
        print "HOST",swclli,$4,$3,$6,$9,$7,$12,$13,$5,$14
    }
    }' Sites1 /home/bob/X25/DataFiles/ALL_SW_DB.txt >>host_remote

または、質問に対するコメントを確認してください。

答え2

以下はより簡単な例です。私のプロフィールで2つのインスタンスを()エクスポートに/home/Bob/X25/DataFiles置き換えたいと思います。このような単純な場合に動作することができれば実際の 。X25DATAFexport X25DATAF=/home/Bob/X25/DataFilesawkawk

$ cat test1
test1_data
test1a_data
test1b_data

Bob@Bob-PC ~/X25/Scott/TEST/TEST1

$ cat /home/Bob/X25/DataFiles/test2
test2_data

Bob@Bob-PC ~/X25/Scott/TEST/TEST1

$ cat gettestfiles

1test11ファイルには3つのレコードがあり、test1_data実行test1a_dataされたtest1b_dataディレクトリと同じディレクトリにあります。awk

ファイルにはtest2レコードが1つしかなく、ディレクトリにtest2_dataあります。/home/Bob/X25/DataFiles

awk -F"_" '
FILENAME=="test1" {
  print $1 " " $2
}
FILENAME=="/home/bob/X25/DataFiles/test2" {
print $0
}
END{ }' test1 /home/bob/X25/DataFiles/test2

Bob@Bob-PC ~/X25/Scott/TEST/TEST1

$ gettestfiles
test1 data
test1a data
test1b data
test2_data

Bob@Bob-PC ~/X25/Scott/TEST/TEST1

$

関連情報