プロが教える店舗&オフィスのセキュリティ対策術

下記の処理を実現する方法を教えてください(シェルスクリプト)

【概要】
二つのファイルに記載しているディレクトリ容量を計算して、
違うファイルに出力する方法を教えてください。

・A.txt
[記載内容]
/backup1/etc/common,20
/backup1_1/etc/common,40
/backup1_2/etc/common,40

・B.txt
[記載内容]
/hoge1/etc/common,20
/hoge1_1/etc/common,35
/hoge1_2/etc/common,44

●上記ファイルを計算して下記のファイルに出力したいです。
・AB.txt
/hoge1/etc/common,0
/hoge1_1/etc/common,-5
/hoge1_2/etc/common,4

大変申し訳ありませんが宜しくお願い致します。

A 回答 (5件)

,20 とか ,40 までがパスなの?

この回答への補足

カンマ区切りになっていまして、数字についてはディレクトリ容量になります。

補足日時:2012/11/11 15:19
    • good
    • 0

> カンマ区切りになっていまして、数字についてはディレクトリ容量に



du するのかと思ったがそれにしては変だと思って。ようやく分かったが B-A の結果が欲しいと言ってるのね? それならこんな感じ

paste -d, A.txt B.txt | awk -F, -v OFS=, '{print $1,$4-$2}' > AB.txt
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。

>B-A の結果が欲しいと言ってるのね?
そのとおりです。
逆にしたい(B-A)場合、「paste -d, B.txt A.txt ・・・」にしたらよいのでしょうか。

お礼日時:2012/11/11 17:04

各行の、二項目目の差を出力すると言うことですかね。



gawk -F, 'FNR==NR{a[FNR]=$2;next}{print $1 "," $2-a[FNR]}' A.txt B.txt > AB.txt
    • good
    • 0
この回答へのお礼

>各行の、二項目目の差を出力すると言うことですかね。
そのとおりです。

ありがとうございます。
さっそく、試させていただきます。

ちなみに、下記のようにAに一行無い場合はどうなりますでしょうか。

※/下の階層名のみ違う

[記載内容]
・A.txt
/backup1_1/etc/common,40
/backup1_2/etc/common,40

・B.txt
[記載内容]
/hoge1/etc/common,20
/hoge1_1/etc/common,35
/hoge1_2/etc/common,44

お礼日時:2012/11/11 20:59

No3です。


>ちなみに、下記のようにAに一行無い場合はどうなりますでしょうか。

どうやって行と行を対応させるのかを定義できるかどうかですね。
「2つめの/の直前の3文字が同じ行同士を対応させる」
でいいのかな?

この回答への補足

いいとおもいます。
うまく対応できそうです。

補足日時:2012/11/12 07:45
    • good
    • 0

No3です。



ということであれば、次のようなファイル foo を作って、
gawk -F, -f foo A.txt B.txt >AB.txt

で。

その1:B.txtの各行に対応するA.txtの行がない場合は出力しない

function f(x){split(x,y,"/");return substr(y[2],length(y[2])-2,3)}
FNR==NR{a[f($1)]=$2;next}
{if(f($1) in a)print $1","a[f($1)]-$2}

その2:B.txtの各行に対応するA.txtの行がない場合は、値0の行がA.txtにあったとして出力

function f(x){split(x,y,"/");return substr(y[2],length(y[2])-2,3)}
FNR==NR{a[f($1)]=$2;next}
{print $1","a[f($1)]-$2}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!