免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3893 | 回复: 17
打印 上一主题 下一主题

求助:名单列表格式转换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-28 21:08 |只看该作者 |倒序浏览
本帖最后由 huazhorg 于 2012-05-29 21:59 编辑

请问:用什么命令,可以将这样一个名单列表:Armstrong, A. R.; Armstrong, G.; Canales, J.; Bruce, P. G. (一些文献里的格式)
转换成这种格式: A. R. Armstrong and G. Armstrong and J. Canales and P. G. Bruce (latex识别的格式)
因为我写文章时经常遇到要将上面那种转换成下面这种格式,用手慢慢调感觉很累,特别是名单列表很长的时候。
如果用一个命令一次性转换就好了,特请高手相助,谢了。

论坛徽章:
0
2 [报告]
发表于 2012-05-28 21:52 |只看该作者
回复 1# huazhorg
  1. awk -F",|;" '{print $2,$1,"and",$4,$3,"and",$6,$5,"and",$8,$7}' file
  2. A.R. Armstrong and G.  Armstrong and J.  Canales and P.G.  Bruce
复制代码
是这样吗?

论坛徽章:
0
3 [报告]
发表于 2012-05-28 22:38 |只看该作者
本帖最后由 huazhorg 于 2012-05-28 22:39 编辑
kk5234 发表于 2012-05-28 21:52
回复 1# huazhorg 是这样吗?


感觉这样不够灵活,只能适用本句话。如果换成这个:

Li, W.;  Bai, Y.;  Yang, Z. H.; Feng, X.; Lu, X. H.; Laak, N. K.; Chan, K. Y., Liu, C.
就不行了吧
关键是每个人的名字,可能简写为2个字母,如X. H. Lu, 有的则只有一个字母,如 Liu, C.
另外,还两个名字的简写字母之间有空格,例如,X. H. Lu, 其中 X. 与 H. 之间是有空格的。
所以还需要一个通用的句法。

论坛徽章:
0
4 [报告]
发表于 2012-05-28 22:49 |只看该作者
设想功能:
1.能自动识别为每个分号;隔开的字段为一个人名 ; Yang, Z. H.;
2.去掉两端的分号 Yang, Z. H.
3. 将,隔开的两个部分,顺序倒换:Z. H., Yang
4. 去掉中间的逗号, Z. H. Yang
5. 对整个姓名列表操作:W. Li and Y. Bai  and Z. H. Yang and X. Feng .....
6. 能对任何姓名列表适用。

论坛徽章:
0
5 [报告]
发表于 2012-05-29 15:09 |只看该作者
顶啊,没有哪位大侠能解决吗?

论坛徽章:
0
6 [报告]
发表于 2012-05-29 15:19 |只看该作者
huazhorg 发表于 2012-05-28 22:38
感觉这样不够灵活,只能适用本句话。如果换成这个:

Li, W.;  Bai, Y.;  Yang, Z. H.; Feng, X.; Lu ...


  1. sed -r 's/ ?(\w+),(( \w\.)+)/\2 \1/g;s/;/ and/g'
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-05-29 16:09 |只看该作者
mpstat 发表于 2012-05-29 15:19


你这个方法我很满意,谢谢。

论坛徽章:
0
8 [报告]
发表于 2012-05-29 18:31 |只看该作者
本帖最后由 jils2013 于 2012-05-29 18:53 编辑
  1. [root@localhost shell]# cat list
  2. Li, W.;  Bai, Y. C. D.;  Yang, Z. H.; Feng, X.; Lu, X. H.; Laak, N. K.; Chan, K. Y.; Liu, C.
  3. [root@localhost shell]# awk 'BEGIN{RS=";|\n";FS=".";}
  4.         {gsub(" ","",$0);
  5.          lastname=substr($0,1,index($1,",")-1);gsub(lastname",","",$0);
  6.          for(i=NF-1;i>0;i--)if(firstname==""){firstname=$i}else{firstname=firstname"."$i};
  7.          if(str==""){str=firstname". "lastname}else{str=str" and "firstname". "lastname};
  8.          firstname="";}
  9.          END{print str}' list
  10. W. Li and D.C.Y. Bai and H.Z. Yang and X. Feng and H.X. Lu and K.N. Laak and Y.K. Chan and C. Liu
复制代码
蛋疼一个awk的,逻辑有点绕,应该有比较简单的

论坛徽章:
0
9 [报告]
发表于 2012-05-29 21:43 |只看该作者
6楼的这个比较简洁点,容易改造,我改成了这样的:
cat namelist.sh
#!/bin/sh
echo -n "Enter the namelist: "
read var1
echo "$var1 " >tmpfile
sed -r 's/ ?(\w+),(( \w\.)+)/\2 \1/g;s/;/ and/g' tmpfile
rm tmpfile

./namelist.sh
Enter the namelist:
Li, W.;  Bai, Y. C. D.;  Yang, Z. H.; Feng, X.; Lu, X. H.; Laak, N. K.; Chan, K. Y.; Liu, C.
W. Li and D.C.Y. Bai and H.Z. Yang and X. Feng and H.X. Lu and K.N. Laak and Y.K. Chan and C. Liu

论坛徽章:
0
10 [报告]
发表于 2012-05-29 21:48 |只看该作者
本帖最后由 huazhorg 于 2012-05-29 21:59 编辑

现在发现6楼也有点小毛病,比如:
./namelist.sh
Enter the namelist:
Lu, X. H.; van der Laak, N. K.; Chan, K. Y.
结果显示为:
X. H. Lu and van der N. K. Laak and K. Y. Chan
(应该为... N. K. van der Laak ...)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP