【问题标题】:Compare 2 files and delete the lines that match criteria using awk / sed /bash比较 2 个文件并使用 awk / sed /bash 删除符合条件的行
【发布时间】:2017-11-22 13:54:22
【问题描述】:

我是 awk 和 sed 的新手,并且有以下要求。

下面是文件数据

旧文件:

SNO,ID,SHAPE,COST,CURRENTCOST
1,ABC,EFG,123,123
2,EEC,EFG,123,12
3,ARR,EFG,123,12

新文件:

SNO,ID,SHAPE,COST,CURRENTCOST
1,ABC,EFG,123,0
2,EEC,EFG,123,12
3,ARR,EFG,123,12 

预期输出文件:

SNO,ID,SHAPE,COST,CURRENTCOST
2,EEC,EFG,123,12
3,ARR,EFG,123,12

首先,我想比较 ID,如果它们匹配 CHECK IF CURRENTCOST(5th Column ) is 0 ,如果是 0 ,则从新文件中删除该行

下面是代码流程

if(CURRENTCOST == 0)
THEN 
  IF(FIRST FILE ID == SECOND FILE ID)
     THEN DELETE THE LINE FROM SECOND FILE 
  ELSE
     DO NOTHING

另外,如果条件为真,我可以跳过复制该行并将其他行复制到新文件中

希望这会有所帮助。

谢谢 光辉

【问题讨论】:

  • 你的预期输出是什么?

标签: bash awk sed


【解决方案1】:

使用awk 你可以这样做:

awk -F, 'NR == FNR {a[$1]=$5; next} !($1 in a && $5 == 0)' oldFile newFile

SNO,ID,SHAPE,COST,CURRENTCOST
2,EEC,EFG,123,12
3,ARR,EFG,123,12

【讨论】:

  • 你能解释一下吗?
  • 我会添加解释,但这是相当简单的 2 文件 awk 命令。这真的有效吗?
  • 是的,我看到我们正在数据结构中添加第 5 列,并检查第 1 列是否与 file2 的第 1 列匹配,如果文件未排序,是否会使解决方案更复杂
  • 或者我们必须在运行 awk 之前对其进行排序,
  • 如果您在问题中添加这些具有预期输出的新示例数据,那么我可以尝试调整我的 awk 命令
【解决方案2】:
grep -v '0$' newFile  | join -t , -o 2.{1..5} oldFile -
  1. 从新文件中删除不需要的行
  2. 将旧文件与标准输入中的修改内容加入
  3. 仅从新文件中选择列

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 2019-12-01
    • 2012-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2021-02-26
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多