【问题标题】:Compare a .txt and .csv file and replace the occurences with reference names比较 .txt 和 .csv 文件并将出现的地方替换为参考名称
【发布时间】:2017-02-08 03:21:15
【问题描述】:

文件1.txt

[fields:WinSpc:defect]
a=b
hello=hi

[fields:ROCKET PROJECT:ticket]
description=Descrtiption
status=status

[fields:abl_tja1146:autoticket]
description=description
status=status

[fields:abl_tja1146:risk]
description=description
assignedToUsername=assigned_to

file2.csv

WinSpc,projects.winspc
ROCKET PROJECT,projects.rocket_project
TJA1146,projects.abl_tja1146

所需的输出如下:

可以追加output.txt或者原txt文件(file1.txt)

[fields:winspc:defect]
a=b
hello=hi

[fields:rocket_project:ticket]
description=Descrtiption
status=status

作为字符串之一(abl_tja1146)是完美的,不需要匹配它们,应该被忽略。

这是来自较早问题的extension,但用于处理应忽略字段的情况。

【问题讨论】:

  • 为什么在预期输出中[fields:rocket_project:ticket] description=Descrtiption 之后缺少status=status
  • 已经回答了另一个问题,但这没有意义。新行只是看其他行,没有办法唯一区分
  • @Inian 哎呀,在打字时错过了,请忽略 file1.txt 中每个 sn-p 的第一行下面的内容,这些可能会改变所需的输出应该只替换第一行中的字符串每个 sn-p 即(例如:[fields:WinSpc:defect] 和 [fields:ROCKET PROJECT:ticket])
  • 更新问题,不在cmets中
  • @Inian 我已经更新了

标签: bash csv awk


【解决方案1】:

下面的Awk 逻辑将为您完成这项工作。

awk 'FNR==NR{split($2,list,"."); replacement[$1]=list[2]; next} \
   $0 ~ /^\[/{split($0,newlist,":"); if(newlist[2] !~ /^[[:lower:]]/) \
      {gsub(newlist[2],replacement[newlist[2]],$0); print; \
          while(getline && $0 != ""){print} print ""} }' FS="," file2.txt file1.txt

根据需要生成输出。

[fields:winspc:defect]
a=b
hello=hi

[fields:rocket_project:ticket]
description=Descrtiption
status=status

要替换的值的哈希映射和从file2 创建的实际值,然后在file1 上,对以[ 开头的行执行regex 匹配,并检查第二个字段for string 是完美的(在您的示例中为小写),如果是这样,则后续行将被丢弃,否则它们会在出现时打印。

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 2015-07-06
    • 2023-04-02
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多