2つのファイルを比較し、一致基準に基づいて異なるファイルを生成します。

2つのファイルを比較し、一致基準に基づいて異なるファイルを生成します。

a.txtとb.txtという2つのファイルがあります。ここで、a.txtにはzn12c5bやzn4i8lなどの「zn」で始まる行が含まれ、b.txtにはt17v11 /などの「/number」パターンで終わる行が含まれています。 112または12c5b/450。

私の目標は、b.txtの文字列(末尾の「/number」パターンなし)と一致しないa.txtの文字列(「zn」なし)をFinal.txtに書き込むことです。

たとえば、

a.txt:

zn12c5b
zn4i8l

b.txt:

t17v11/112
12c5b/450
4i8ls/681

Final.txt で次の出力を取得する必要があります。

4i8l

注:a.txtファイルの4i8l(「zn」プレフィックスなし)は、ファイルの4i8ls(「/ 681」サフィックスなし)と同じではありません。私はUbuntuシステムを使用しています。

答え1

$ awk -F'/' 'NR==FNR{b[$1]; next} {sub(/^zn/,"")} !($1 in b)' b.txt a.txt
4i8l

答え2

次のbashスクリプトは操作を実行する必要があります(bash 4以降で始まります)。

#!/bin/bash
readarray -t a_arr < a.txt
readarray -t b_arr < b.txt

for a_el in "${a_arr[@]}"
do 
    # remove the first two characters 'zn'
    substr_a=${a_el:2}
    isin=0
    for b_el in "${b_arr[@]}"
    do  
        # extract matches from b.txt file
        substr_b=$(echo $b_el | sed -n "s#^\(.*\)\/[[:digit:]]\+#\1#p")
        if [ "$substr_a" == "$substr_b" ];then isin=1; break;fi
    done
    if [ $isin -eq 0 ];then echo $substr_a ;fi
done > final.txt

4より低いbashバージョンを使用している場合は、readarrayこの行を次のように置き換える必要があります。

a_arr=($(<a.txt))
b_arr=($(<b.txt))

答え3

醜いネチズンはこんな感じ

sdiff -s <(sed 's/^zn//' a.txt|sort) <(awk -F/ '{ print $1 }' b.txt| sort) | awk -F'[<|>]' '{ print $1 }'
#1         #2                          #3                                    #4 

仕事をします。

説明する:

#1 sdiff2つのテキストファイルを1行ずつ比較します。 -s オプションは共通行を抑制します。

#2 seda.txt ファイルの各行の先頭から zn プレフィックスを削除します。

awk#3はb.txtファイルの各行の左側の部分だけを出力するように指示されました。/

< |#4別のawkは文字列または文字の左側の部分のみを出力するように指示されます>。これらの文字はsdiff出力の区切り文字です。

<(somecommand) イディオムとも呼ばれるプロセスの交換一部のコマンドの出力によって生成されたコンテンツを含むファイル名として扱われます。

| sort明らかに、出力はsdiffソートされたファイルを提供するようにソートされます。

答え4

awkGNU(実装済みBEGINFILE)がある場合は、次のことができます。

awk 'BEGINFILE{FS=(NR!=0)?"^..":"/"}
     NR==FNR{test[$1]=1; next}
     !($2 in test){print $2}' b.txt a.txt

418l

a.txt新しいファイルにリダイレクトするのではなく書き換えたい場合は、次> final.txtを追加できます。

| sponge a.txt

awk 'BEGINFILE{FS=(NR!=0)?"^..":"/"}

最初のファイルが開いたときにBEGINFILE実行されるNR==0ためFS=/

     NR==FNR{test[$1]=1; next}

テスト配列にNR==FNRロードされた最初のファイルを繰り返します。$1

2番目のファイルが開くと再実行されますが、BEGINFILE入力行の最初の2文字以降のすべての内容をNR!=0削除します。FS=^..$2

     !($2 in test){print $2}' b.txt a.txt

print $2テストアレイにない場合は、2番目のファイルを繰り返します!($2 in test)

関連情報