中間ファイル(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に参加します。- ファイルシステムのパスにスペースがないとします(もともと質問でもあります)。