編集する

編集する

列がタブで区切られた異なる形式の2つのファイルがあります。の列をとcolumn1比較する必要があります。一致する場合は、の値をの値に置き換える必要があります。試してみましたが、値を置き換えることはできません。以下のコードスニペットの提案を提供できますか?column2file1file2column6file1column3file2awk

awk 'FILENAME == ARGV[1] {
    m[$1,$2] = $6;
    next;
}
{
    if (($1,$2) in m) {
        m[$6]= $3; print m[$6];
    }
}' file1 file2


top few lines of file1
1201 12011 1 0 0 0 1
1202 12021 1 0 0 0 1
1203 12031 1 0 0 0 1
1204 12041 1 0 0 0 2
1207 12071 1 0 0 0 2
1209 12091 1 0 0 0 1
1210 12101 1 0 0 0 1
1212 12121 1 0 0 0 1
1213 12131 1 0 0 0 1
1214 12141 1 0 0 0 2

top few lines of file2
1201    12011   1
1202    12021   1
1203    12031   1
1204    12041   1
1206    NA  1
1207    12071   2
1208    NA  1
1209    12091   2
1210    12101   2

更新された内容を別のファイルに書きたいので、file2の値をfile1列に割り当てたいと思います。out.txt

編集する

コメントに基づいて次のコードを試しました。

awk '{
    if (FNR==NR) {
        a[FNR]=$1;b[FNR]=$2;c[FNR]=$3}
    else {             
        if (a[FNR] == $1 && b[FNR] ==$2) {
            $6=c[FNR]} else {$6=$6};
           print $0;
        }
    }' file2 file1

この出力を得る

1201 12011 1 0 0 1 1
1202 12021 1 0 0 1 1
1203 12031 1 0 0 1 1
1204 12041 1 0 0 1 2
1207 12071 1 0 0 0 2
1209 12091 1 0 0 0 1
1210 12101 1 0 0 0 1
1212 12121 1 0 0 0 1
1213 12131 1 0 0 0 1
1214 12141 1 0 0 0 2

ベストアンサー1

awk -F"\t" -v OFS="\t" '{
    if (FNR==NR) {
        a[FNR]=$1;b[FNR]=$2;c[FNR]=$3}
    else {
        if (a[FNR] == $1 && b[FNR] ==$2) {
            $6=c[FNR]} else {$6=$6};
            print $0
        }
    }' file2 file1

私はこれが仕事を終えると思います。まず、それぞれインデックスを使用して、file2の最初、2番目、および3番目の列をarrayに格納しますa(file2の行のみ)。 Else (file1 の行のみに適用) 配列 sum の値を sum と比較します。一致する場合は、配列の6番目のフィールドを変更します。それ以外の場合は、値を同じ値に再割り当てし、区切り文字を 。bcFNRFNR = NRab$1$2ctab

おすすめ記事