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 sdiff
2つのテキストファイルを1行ずつ比較します。 -s オプションは共通行を抑制します。
#2 sed
a.txt ファイルの各行の先頭から zn プレフィックスを削除します。
awk
#3はb.txtファイルの各行の左側の部分だけを出力するように指示されました。/
<
|
#4別のawkは文字列または文字の左側の部分のみを出力するように指示されます>
。これらの文字はsdiff
出力の区切り文字です。
<(somecommand)
イディオムとも呼ばれるプロセスの交換一部のコマンドの出力によって生成されたコンテンツを含むファイル名として扱われます。
| sort
明らかに、出力はsdiff
ソートされたファイルを提供するようにソートされます。
答え4
awk
GNU(実装済み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)
。