Nat*_*ace 4 bash text-processing
我有一种情况,我有几行,我需要每行都有两个不同的字段。具体来说,我在参考书目中有一个参考列表,我想获得姓氏和年份。
样本输入:
Aloise-Young, P.A. (1993). The development of self-presentation. Self-promotion in 6- to 10-year-old children. Social Cognition, 11, 201-222.
Banerjee, R. (2002). Children's understanding of self-presentational behavior: Links with mental-state reasoning and the attribution of embarrassment. Merril-Palmer Quarterly, 48, 378-404.
Bennett, M., & Wellman, H. (1989). The role of second-order belief-understanding and social context in children's self-attribution of social emotions. Social Development, 9, 126-130.
Run Code Online (Sandbox Code Playgroud)
期望的输出:
Aloise-Young 1993
Banerjee 2002
Bennett 1989
Run Code Online (Sandbox Code Playgroud)
我可以得到姓氏 cat file | cut -d, -f1
我可以得到岁月 cat file | grep -o "[[:digit:]]\{4\}"
我的问题是,现在我有两个独立的输出,但我不知道如何以我想要的方式组合它们。有任何想法吗?我怀疑也许awk可以做我需要的。
当文本处理对于基本工具来说太难了,试试Awk。
awk -F , '{last_name = $1; sub(/\).*/, ""); sub(/.*\(/, ""); print last_name, $0}'
Run Code Online (Sandbox Code Playgroud)
这里 sed 差不多——它的可读性较差,但 awk 缺乏反向引用。
sed -n 's/^\([^,]*\),[^(]*(\([^()]*\)).*/\1 \2/p'
Run Code Online (Sandbox Code Playgroud)
对于这个特殊的任务,Perl 总体上稍微容易一些。您可以使用非贪婪重复运算符*?来确保捕获该行的第一个括号部分。
perl -l -ne '/^([^,]*),.*?\(([^()]*)\)/ and print "$1 $2"'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1420 次 |
| 最近记录: |