Shellでさまざまなテキストファイルのデータを比較して印刷する方法。
私は以下を使用してNAS
3つの異なるボックスの詳細をキャプチャしました。SSH
マウント名同じ場合は、最初の列にする必要があります。山3つのボックスに存在する場合は、同じ行に印刷する必要があります。山のみ表示されますBOX_BそしてBOX_Cそれからマウント名最初の列に表示する必要があります。ボックス_A空にする必要があります
2つの例を見てみましょう。df_BoxA.txtそしてdf_BoxB.txtそしてdf_BoxC.txt
例:
$cat df_BoxA.txt
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxA
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxA
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxA
/data/java 1G 67M 9.3G 7% NAS:/data/java
/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
$cat df_BoxB.txt
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxB
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxB
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxB
/home/user 40G 29.3G 107G 74% NAS:/home/user1
/data/java 1G 67M 9.3G 7% NAS:/data/java
/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
$cat df_BoxC.txt
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxC
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxC
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxC
/home/user1 40G 29.3G 107G 74% NAS:/home/user1
/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
3つのファイルをすべてマージした後、結果は次のようになります。
$cat result.txt
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxB 2G 1.2G 7.7G 62% NAS:/logs/boxC
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxB 2G 1.8G 2.0G 91% NAS:/data/boxC
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxB 2G 1.4G 5.7G 72% NAS:/apps/boxC
/data/java 1G 67M 9.3G 7% NAS:/data/java 1G 67M 9.3G 7% NAS:/data/java
/home/admin 10G 4.6G 54G 46% NAS:/home/admin10G 4.6G 54G 46% NAS:/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
/home/user 40G 29.3G 107G 74% NAS:/home/user1
/home/user1 40G 29.3G 107G 74% NAS:/home/user1
コマンドを使用してファイルを結合してみましたが、それはpr
望む結果ではありません。
また試してみましたsdiff
が、結果は得られませんでした。
この問題をどのように解決できますか?
ベストアンサー1
実行したい操作には少しプログラミングが必要です。
#!/usr/bin/perl
# Program to join files of TAB separated data based on first key
# --J. Ziobro--: 11/2014
use strict;
my $f;
my %allLines;
my $maxColumns = 0;
my $fileNum = 0;
my %keys;
foreach $f (@ARGV) {
die "Could not open $f" unless open( F, $f );
while (<F>) {
chop;
my ( $key, @line ) = split /\t/; # assume tab separate all cols
$maxColumns = ( $maxColumns > @line ) ? $maxColumns : @line;
# allLines is indexed by KEY <tab> FileNumber
$keys{$key} = 1;
$allLines{ $key . "\t" . $fileNum } = join( "\t", @line );
}
$fileNum++;
}
foreach ( keys %keys ) {
print $_;
for ( $f = 0 ; $f < $fileNum ; $f++ ) {
if ( exists $allLines{ $_ . "\t" . $f } ) {
print "\t", $allLines{ $_ . "\t" . $f };
}
else {
print " " x $maxColumns;
}
}
print "\n";
}
さようなら、 //Z\