ファイルを読むときに特定のフィールドを選択し、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

答え2

私がコメントで述べたように、あなたが何をしたいのか完全にはわかりません。あなたはいつもフィールドを印刷しcd比較したいようです。ただ dそしてz。その場合、以下の解決策が機能します。

$ paste a b | awk '{print $3,$4,$6}' | head -n 1; paste a b | tail -n +2 |
   while read a b c d e z; do 
    echo -n "$c $d"; 
    if [ "$d" -lt "$z" ]; then 
      echo "pin sma"; 
    elif [ "$d" -gt "$z" ]; then 
      echo "pin lon"; 
    else echo $z; 
    fi; 
   done 

提供されたサンプルファイルを実行すると、次のようになります。

c d z
2 33
6 5pin lon
0 9pin lon

説明する

算術比較を実行しようとしているため、ヘッダーはスクリプトを中断します。しかし、最終出力には含めたいと思います。まず印刷します。

paste a b | awk '{print $3,$4,$6}' | head -n 1;

それでは、ヘッダーをスキップして残りのフィールドを処理します。だから私たちはpasteヘッダー(tail -n +2)をスキップしてフィールドを処理してファイルを再表示します。

関連情報