ファイルを読むときに特定のフィールドを選択し、Unix bashの他のファイルと比較しますか?

ファイルを読むときに特定のフィールドを選択し、Unix bashの他のファイルと比較しますか?

a、b、c、d、e列を含むCSVファイルとz列を含む他のファイルがあります。最初のファイルから1行ずつ読み込むときにcフィールドとdフィールドだけが必要で、2番目のファイルのdとzを比較したいと思います。

zは変数で、意味はですfor i in catfileb do ......。 d が z に等しい場合は z が表示され、異なる場合は常に「pin」が表示されます。ただし、z が最長または最小の場合、「lon」または「sma」が表示されます。

ファイル1:

a b c d e
1 2 2 3 3
3 4 6 5 9
4 5 0 9 9

ファイルb:

z
3
1
8

だから、c、d、zは変数なので、2つのループを考えました。ファイルを1行ずつ読み、cとdをインポートして、zと比較します。

ベストアンサー1

file b1行をinの対応する行と比較したい場合file a(つまり、2つのファイルの行数が同じで1行ずつ比較する場合)、Perlスクリプトを使用してこれを実行できます。

#!/usr/bin/perl
$file_a = "/path/to/file_a";
$file_b = "/path/to/file_b";
open $fa,'<',$file_a or die "Failed to open file $file_a: $!\n";
open $fb,'<',$file_b or die "Failed to open file $file_b: $!\n";
@file_a = <$fa>;
@file_b = <$fb>;
close $fa;
close $fb;
for (0..$#file_a){
    ($col_c,$col_d) = (split / /,$file_a[$_])[2,3];
    $col_z = $file_b[$_];
    $to_display = "$col_c $col_d";
    if($col_z eq $col_d){
        $to_display .= " $col_z";
    }
    else{
        $to_display .= " pin";
        if ($col_z gt $col_c and $col_z gt $col_d ){
            $to_display .= " lon";
        }
        elsif($col_z lt $col_c and $col_z lt $col_d) {
            $to_display .= " sma";
        }
    }
    print "$to_display\n";
}

上記のファイルを(/path/to/myscriptおよび実際の場所を変更した後)として保存し、実行可能にして最後に呼び出します。file_afile_bchmod +x /path/to/myscript$ /path/to/myscript

おすすめ記事