IBM AIX kshで2つのコマンドの結果をリンクする方法

IBM AIX kshで2つのコマンドの結果をリンクする方法

中間ファイル(lsfs.out、df.out)を生成せずにkshを使用して、IBM AIXで次のスクリプトを実行したいと思います。

lsfs_out=`lsfs | sed -n '1d;p' | sort -b -k 3`
df_out=`df -k | sed -n '1d;p' | sort -b -k 7`
echo "$lsfs_out" > lsfs.out
echo "$df_out" > df.out
join -1 7 -2 3 df.out lsfs.out

最初のコマンドの出力は次のようになります。

lsfs | sed -n '1d;p' | sort -b -k 3
/dev/hd4        --         /                      jfs2  4194304 --         yes  no
/dev/hd11admin  --         /admin                 jfs2  1048576 --         yes  no

2番目のコマンドの出力は次のとおりです。

df -k | sed -n '1d;p' | sort -b -k 7
/dev/hd4          2097152    836284   61%     9360     5% /
/dev/hd11admin      524288    523848    1%        7     1% /admin

"join"コマンドのファイル名をコマンド出力に置き換える方法を理解できません。

私が試したことは役に立ちませんでした。たとえば、

join -1 7 -2 3 <(echo "$df_out") <(echo "$lsfs_out")
ksh: 0403-057 Syntax error: `(' is not expected.

もう一つ

join -1 7 -2 3 <`echo "$df_out"` <`echo "$lsfs_out"`
A file or path name is too long.
< some output >
Cannot find or open the file.

答え1

ソリューションawk(もちろんオンライン)

(df -k ; lsfs ) |
awk 'FNR==1 {next; }
     NF==7 { L[$7]=$0 ; next ; }
     { printf "%s %s\n",$0,L[$3];}'

どこ

  • FNR==1 {next; }フィルタヘッダ
  • NF==7 { L[$7]=$0 ; next ; }ファイルシステムにインデックス付きdf行を保存する
  • { printf "%s %s\n",$0,L[$3];}lsfs行を印刷してdfに参加します。
  • ファイルシステムのパスにスペースがないとします(もともと質問でもあります)。

関連情報