我正在向熟悉 grep 或 awk 最佳用法的人寻求帮助,以实现自己的目标。
我们与一个应用程序签订了接口合同,该应用程序将包含有关我们团队成员在场的信息的csv文件发送到我们的服务器(Redhat)。 该文件是这样制作的:
staff_id1|PPAAPPPAAAPPPAAPAPAPPPAAA...
staff_id2|PPPPPPPPPAPAPAPAAAPPAPAPP...
.........|....
我的首要目标是从今天开始以后才需要P&A,所以我需要从801到1602之间进行收集。在为每个工作人员id收集所需字符之后,我想将它们重新组合成这样的日子:
AA To 0 => full day absent
AP To 1 => pm present
PA To 2 => am present
PP To 3 => full day present
以逗号或“;”分隔理想情况下,我可以将新文件加载到数据库中。
staff_id1;0;1;1;1;0;2;0;0;3;3;2;0;0;1;2;2;0;3;0
staff_id2;0;1;1;1;0;2;0;0;3;3;2;0;0;1;2;2;0;3;0
...;...;...
我知道这是一个非常具体的问题,但我至少需要急救才能开始。
任何评论意见或帮助都会很棒。
TY!
答案 0 :(得分:0)
编辑: :现在通过调整我以前的解决方案本身和定界符来添加解决方案。
awk '
BEGIN{
FS="|"
OFS=";"
}
{
num=split($2,array,"");
for(i=1;i<=num;i+=2){
val1=(val1?val1 OFS:"")\
(array[i]=="A" && array[i+1]=="A"?0:\
(array[i]=="A" && array[i+1]=="P"?1:\
(array[i]=="P" && array[i+1]=="A"?2:\
(array[i]=="P" && array[i+1]=="P"?3:"")\
)))}
print $1 FS val1;
val1=""
}' Input_file
能否请您尝试以下操作,并告诉我这是否对您有帮助(已通过GNU awk
测试)。
awk -F"|" '
{
num=split($2,array,"");
for(i=1;i<=num;i+=2){
val1=val1 (array[i]=="A" && array[i+1]=="A"?0:\
(array[i]=="A" && array[i+1]=="P"?1:\
(array[i]=="P" && array[i+1]=="A"?2:\
(array[i]=="P" && array[i+1]=="P"?3:"")\
)))}
print $1 FS val1;
val1=""
}' Input_file
答案 1 :(得分:0)
这是您要找的吗?
$ cat file
staff_id1|PPAAPPPAAAPPPAAPAPAPPPAA
staff_id2|PPPPPPPPPAPAPAPAAAPPAPAP
$ cat tst.awk
BEGIN {
FS = "[|]"
OFS = ";"
map["AA"] = 0
map["AP"] = 1
map["PA"] = 2
map["PP"] = 3
}
{
n = length($2) - 1
printf "%s", $1
for (i=1; i<=n; i+=2) {
printf "%s%s", OFS, map[substr($2,i,2)]
}
print ""
}
$ awk -f tst.awk file
staff_id1;3;0;3;2;0;3;2;1;1;1;3;0
staff_id2;3;3;3;3;2;2;2;2;0;3;1;1
在下面写下您的评论,也许这是您要在shell脚本中执行的操作:
file='file.csv' # or file="$1" if you're passing a parameter to a shell script.
awk '
BEGIN {
...
}
' "$file"