如何使用grep但没有for循环在shell脚本中执行以下任务?

use*_*393 1 python bash shell awk grep

我有一个文件,比如A.txt,它有大约80,000行,但有2个字段.示例行如下所示:

utt1 f 
utt2 f 
utt3 m 
utt4 f
Run Code Online (Sandbox Code Playgroud)

我有第二个文件B.txt,它比A.txt有更多的行,并有两个字段.示例行如下所示

utt1_1 somethingHere    
utt1_2 somethingElse    
utt2_1 someText    
utt2_2 somemore    
utt2_3 someMore    
utt3_1 someText    
utt4_1 somemore    
utt4_2 abcd    
utt4_3 aanan
Run Code Online (Sandbox Code Playgroud)

B.txt中的第一个字段与A.txt中的第一个字段基本相同,后跟_something(每行重复可变次数).

我的任务是创建一个看起来像这样的文件

utt1_1 f    
utt1_2 f    
utt2_1 f    
utt2_2 f    
utt2_3 f    
utt3_1 m    
utt4_1 f    
utt4_2 f    
utt4_3 f
Run Code Online (Sandbox Code Playgroud)

'f'和'm'开始于性别.换句话说,我想做的是从A.txt和grep中获取utt和性别信息,以获取B.txt中的话语,并将第一个字段映射到正确的性别.我正在使用while循环,如下所示:

while read utt gen; do
   grep $utt B.txt | awk -v gen=$gen '{print $1" "gen}'
done < A.txt
Run Code Online (Sandbox Code Playgroud)

因为,我在一个循环中完成它,并且A.txt的长度很大,因此需要花费大量时间来完成任务.你能建议我使用bash更快的方式吗?

谢谢

anu*_*ava 5

这是awk2文件处理的量身定制的工作:

awk 'FNR == NR {a[$1] = $2; next} $1 in a {print $1 "_" $2, a[$1]}' file1 FS='[_ ]' file2
utt1_1 f
utt1_2 f
utt2_1 f
utt2_2 f
utt2_3 f
utt3_1 m
utt4_1 f
utt4_2 f
utt4_3 f
Run Code Online (Sandbox Code Playgroud)

参数仅file1 FS='[_ ]' file2设置输入字段分隔符_或空格file2.

参考: 有效的AWK编程