Skip to main content
 首页 » 编程设计

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

2025年05月04日16emanlee

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

utt1 f  
utt2 f  
utt3 m  
utt4 f 

我有第二个文件 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 

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 

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

while read utt gen; do 
   grep $utt B.txt | awk -v gen=$gen '{print $1" "gen}' 
done < A.txt 

因为我在循环中执行此操作并且 A.txt 的长度很大,所以需要花费大量时间才能完成任务。你能建议我使用 bash 的更快方法吗?

谢谢

请您参考如下方法:

这是为 awk 2 文件处理量身定制的工作:

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 

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

引用: Effective AWK Programming