두 가지 기능을 반복하는 bash 스크립트

두 가지 기능을 반복하는 bash 스크립트

다섯 번째 열을 가장 높은 값으로 정렬하고 다섯 번째 열과 일치하면 네 번째 열을 선택하고 싶습니다.

고양이 감시 목록

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명령은 파일에서 헤더를 제거하고 sort다섯 번째 열의 나머지 행을 숫자 내림차순으로 정렬합니다. 마지막으로 awk네 번째 열을 추출합니다.

이 접근 방식은 열 자체에 공백 문자가 포함되어 있지 않은 한 작동합니다.


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;

관련 정보