【问题标题】:Shell script to compare two specific rows in a single CSV file用于比较单个 CSV 文件中的两个特定行的 Shell 脚本
【发布时间】:2014-12-18 10:29:32
【问题描述】:

我正在尝试学习 shell 脚本。我有一个 CSV 文件,格式如下:

Time, value1, value2, value3
12-17 17:47:55.380,1,2,9
12-17 17:48:55.380,8,4,9
12-17 17:49:55.380,1,2,9
12-17 17:50:55.380,8,4,9

我正在寻找类似下面的 csv 输出:

0,0,0,0
1,7,2,0
1,-7,-2,0
1,7,2,0

到目前为止,我已经编写了代码:

First_value=ps -ef |awk "NR==1{print ;exit}" try.csv Second_value=ps -ef |awk "NR==2{print ;exit}" try.csv  echo diff = $Second_value - $First_value

但我收到如下错误:

read.sh: 14: read.sh: 12-17: 未找到。

以下是我的查询:

  • 我无法将其置于循环中并获得输出。我想 知道,我如何将结果写回同一个 csv 文件,但在 特定的行和列。

【问题讨论】:

  • 究竟有哪些行之间的差异?
  • 预期输出是什么?您尝试过什么?
  • 请分享您目前尝试过的代码?
  • 我正在寻找类似的 CSV 输出:1,7,2,0 /1, -7,-2,0 / 1, 7,2,0。 / 在此处指定为 csv 文件中的下一行。到目前为止,我已经编写了代码: i=1 First_value=ps -ef |awk "NR==$i{print ;exit}" try.csv echo $First_value b=i+1 Second_value=ps -ef |awk "NR==$b{print ;exit}" try.csv echo $Second_value diff = $Second_value - $First_value echo diff exit... 但我不知道如何将其放入循环并获取输出..放入变量后..它无法正常工作。
  • 最好点击您问题下方的编辑链接并提供相关信息。

标签: shell


【解决方案1】:

以下脚本 (csvdiff.sh) 将比较您选择的两行并将这些行与原始分隔字符输出。

#! /bin/bash

# input:   $1 - CVS file
#          $2 - line number of line to subtract from
#          $3 - line number of line to subtract

# Save separators
head -n1 $1 | sed 's/[0-9]\+/\n/g' | head -n-1 | tail -n+2 > .seps

# check for reversed compare
if [ $3 -lt $2 ]
then
    first=$3
    second=$2
    reversed=1
else
    first=$2
    second=$3
    reversed=0
fi

# get requested lines ($2 & $3) from the CVS file as supplied in $1
awk -v first=$2 -v second=$3 -F'[,: ]' 'BEGIN { OFS="\n" } 
   NR==first{ split($0,v) } 
   NR==second{ 
       split($0,w) 
       res=0 
       for (i in w) {
           $i = v[i]-w[i]
       } 
       print
    }' $1 > .vals

# handle reversed compare
if [ $reversed -eq 1 ]
then
    awk '{print $1 * -1}' .vals > .tmp
    mv .tmp .vals
fi

# paste the differences with the original seperation characters
paste -d'\0' .vals .seps | paste -sd'\0'

# remove used files
rm .vals .seps

示例用法:

$ cat file
2,2,3,4,5:10
1,2,3,4,5:12
$ chmod +x csvdiff.sh
$ bash csvdiff.sh file 1 2
1,0,0,0,0:-2
$ bash csvdiff.sh file 2 1
-1,0,0,0,0:2

请注意,此脚本将比较由多个分隔符(例如冒号和逗号)分隔的字段。但是,它不会考虑时间等语义。这意味着日期不会作为一个整体减去,而是逐个减去。

【讨论】:

  • 早些时候我尝试接受它。但是我的评分很低。:(..对不起..但是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多