使用awk创建文件

时间:2016-05-30 05:54:15

标签: linux bash shell awk

我有一个包含以下内容的文件:

  

Q先生   01629699998
  Nhung女士   011287633
  ...

我想使用此awk '{print "BEGIN:VCARD";print "Name:"$0;print "TELEPHONE:"$0;print "END:VCARD"}' file来创建此结果

  

开始:VCARD
  姓名:Q先生   联系电话:01629699998
  END:VCARD
  BEGIN:VCARD
  姓名:Nhung女士   电话:011287633
  END:VCARD
  ...

但是上面的代码没有得到,任何人都可以帮助我,谢谢

2 个答案:

答案 0 :(得分:2)

尝试:

$ awk '{if (NR%2) printf "BEGIN:VCARD\nName: %s\n",$0; else printf "TELEPHONE:%s\nEND:VCARD\n",$0}' inputfile
BEGIN:VCARD
Name: Mr Q
TELEPHONE:01629699998
END:VCARD
BEGIN:VCARD
Name: Ms Nhung
TELEPHONE:011287633
END:VCARD

如何运作

您的输入文件由成对的行组成。第一行有一个名字,第二行有一个电话号码。因此,我们想在奇数行(名称)和偶数行(电话)上做一些不同的事情。

  • if (NR%2)

    这将开始if语句,其中的测试基于模数为2的行号。

  • printf "BEGIN:VCARD\nName: %s\n",$0

    这是对奇数行执行的命令。

  • else printf "TELEPHONE:%s\nEND:VCARD\n",$0

    这是对偶数行执行的操作。

答案 1 :(得分:0)

这是使用printf的纯粹bash选项:

$ cat list_file # I have added one more entry for explanation.
Mr Q
01629699998
Ms Nhung
011287633
Dr. Drake Ramoray
0123456789

$ OLDIFS="$IFS" # save old IFS
$ IFS=$'\n'     # Set IFS to newline, because the entries are newline separated.

$ printf 'BEGIN:VCARD\nName: %s\nTELEPHONE:%s\nEND:VCARD\n' $(<list_file)
BEGIN:VCARD
Name: Mr Q
TELEPHONE:01629699998
END:VCARD
BEGIN:VCARD
Name: Ms Nhung
TELEPHONE:011287633
END:VCARD
BEGIN:VCARD
Name: Dr. Drake Ramoray
TELEPHONE:0123456789
END:VCARD

$ IFS="$OLDIFS" # restore old IFS

说明:

  1. 这里,printf除格式字符串外还有6个参数:6行由换行符分隔(我们设置为IFS)。
  2. 然后
  3. printf发现其格式字符串包含2个%s个条目。因此,它将6个参数分为3组2个参数。
  4. 对于每个组,它会打印格式化的字符串。