用于在文件中进行特定搜索并转储到其他文件的命令

时间:2018-07-22 15:17:28

标签: bash awk grep

我正在向熟悉 grep awk 最佳用法的人寻求帮助,以实现自己的目标。

我们与一个应用程序签订了接口合同,该应用程序将包含有关我们团队成员在场的信息的csv文件发送到我们的服务器(Redhat)。 该文件是这样制作的:

staff_id1|PPAAPPPAAAPPPAAPAPAPPPAAA...
staff_id2|PPPPPPPPPAPAPAPAAAPPAPAPP...
.........|....
  • P:当前和A:不存在
  • 每个P和A代表半天。
  • 所以其中有2天是一天
  • A&P的数量为:今天之前800和今天之后800
  • 总共有1602个A&P
  • 今天之前800天,今天2天,之后400天800 今天

我的首要目标是从今天开始以后才需要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!

2 个答案:

答案 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"