2つの機能を繰り返すbashスクリプト

2つの機能を繰り返すbashスクリプト

5番目の列を最も高い値にソートし、5番目の列と一致する場合は、4番目の列を選択したいと思います。

猫監視リスト

C1 C2  C3          C4                                          C5 C6
3  No  ENCRYPTION  /opt/oracle/oradata/ORCLCDB/encryption.dbf  8  0  
2  No  RETENTION   /opt/oracle/oradata/ORCLCDB/retention.dbf   5  0  
4  No  ORACLE      /opt/oracle/oradata/ORCLCDB/oracle.dbf      2  0 
1  No  USERS       /opt/oracle/oradata/ORCLCDB/users01.dbf     3  0`

次のようにする必要があります。

for file in $C5; do
select $C4 from from dual;
done


select /opt/oracle/oradata/ORCLCDB/users01.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/retention.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/oracle.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/encryption.dbf from dual;`

これまで試してみたのはうまくいきますが、C1の値に基づいて出力を読み取りますが、C5に基づいて出力を最高から最低まで読みたいのですが。

for (( x=1; x <= ${FILE_COUNT}; x++)) ; do
        FILE_NAME=cat $TABLE_LIST|sort -rk5 |awk -vx="$x" '$1 == x {print $4} $3 == x {print $1}'
        FILE_SIZE=cat $TABLE_LIST|sort -rk5 |awk -vx="$x" '$1 == x {print $5} $3 == x {print $1}'
done

ありがとうございます!

答え1

コメントによると列5で指定された順序(逆順)で列4をリストしようとしています。

$ sed '1d' <TABLE_LIST | sort -k5,5nr | awk '{ print $4 }'
/opt/oracle/oradata/ORCLCDB/encryption.dbf
/opt/oracle/oradata/ORCLCDB/retention.dbf
/opt/oracle/oradata/ORCLCDB/users01.dbf
/opt/oracle/oradata/ORCLCDB/oracle.dbf

このsedコマンドは、ファイルからヘッダーを削除し、sort5番目の列の残りの行を数値の降順にソートします。最後に、awk4番目の列を抽出します。

このアプローチは、列自体に空白文字が含まれていない限り機能します。


selectこれらとfrom dual;文字列を挿入するには、awkパイプ部分を変更できます。

$ sed '1d' <TABLE_LIST | sort -k5,5nr | awk '{ printf("select %s from dual;\n", $4) }'
select /opt/oracle/oradata/ORCLCDB/encryption.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/retention.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/users01.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/oracle.dbf from dual;

答え2

GNU Awk > 4.0を使う

gawk '
  FNR>1 {a[$5] = $4} 
  END {
    PROCINFO["sorted_in"] = "@ind_num_desc"; 
    for (i in a) print "select " a[i] " from dual;"
  }
' TABLE_LIST 
select /opt/oracle/oradata/ORCLCDB/encryption.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/retention.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/users01.dbf from dual;
select /opt/oracle/oradata/ORCLCDB/oracle.dbf from dual;

関連情報