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 b
1行を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_a
file_b
chmod +x /path/to/myscript
$ /path/to/myscript
答え2
私がコメントで述べたように、あなたが何をしたいのか完全にはわかりません。あなたはいつもフィールドを印刷しc
てd
比較したいようです。ただ 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
)をスキップしてフィールドを処理してファイルを再表示します。