如何使用awk脚本运行文本文件

时间:2014-02-26 06:24:14

标签: unix awk gawk

我需要运行一个文本文件doctors.txt,它以以下格式编写:

Sarah,Jenny,Charles;Dr. Hampton
Jenny,Lucy,Harry;Dr. Fritz
Ben,Kaitlyn,Connor,Charles;Dr. Hampton

并输出:

Dr. Hampton: Sarah Jenny Charles Ben Kaitlyn Connor
Dr. Fritz: Jenny Lucy Harry

(如果不止一次提到某人,我就不能重复他们)

我需要使用awk执行此操作,我目前在尝试使其打印任何内容时遇到问题:

我的代码是:

 #!/user/bin/awk -f
awk 'BEGIN {for i in $(doctors.txt) {
split(i,doctors,";");}
END{print doctors[1]}'

当我运行它时,我得到了

awk: 3: unexpected character '''
awk: 5: unexpected character '''

有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:2)

试试这个awk

awk -F\; '{gsub(/,/," ");a[$2]=a[$2]?a[$2]" "$1:$1} END {for (i in a) print i": "a[i]}' doctors.txt
Dr. Fritz: Jenny Lucy Harry
Dr. Hampton: Sarah Jenny Charles Ben Kaitlyn Connor Charles

在脚本中使用它:

#!/bin/bash
awk -F\; '{gsub(/,/," ");a[$2]=a[$2]?a[$2]" "$1:$1} END {for (i in a) print i": "a[i]}' doctors.txt > doctors2.txt

它是如何运作的:

a[$2]=      # give array a[$2] the following value
a[$2]       # test if array a[$2] have data already
?           # If yes then
a[$2]" "$1  # add $1 to the variable already stored there
:           # If no the
$1          " just sett array a[$2] to value in $1

此部分a[$2]=a[$2]?a[$2]" "$1:$1可以替换为

if (a[$2]) a[$2]=a[$2]" "$1; else a[$2]=$1

可以缩短一些:(不需要测试,因为额外的空间是可以的)

awk -F\; '{gsub(/,/," ");a[$2]=a[$2]" "$1} END {for (i in a) print i":"a[i]}' doctors.txt

答案 1 :(得分:1)

可能你可以使用perl:

perl -F";" -lane '@a=split /,/,$F[0];
                  $x{$F[1]}.="@a";
                  END{print "$_:$x{$_}" for(keys %x)}' your_file

经过测试here

如果你坚持使用awk:

awk -F';' '{
           gsub(/,/," ",$1);
           a[$2]=a[$2]""$1}
           END{for(i in a)print i":"a[i]
           }' yourfile

测试了awk版本here

答案 2 :(得分:-1)

awk -F ";" '{print $1}' doctors.txt
相关问题