我需要运行一个文本文件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 '''
有人可以帮我这个吗?
答案 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