【问题标题】:cut command issue with 2nd column第二列的剪切命令问题
【发布时间】:2016-07-20 10:19:51
【问题描述】:

我正在尝试从字符串中删除某些值。它在第一列中按预期工作,但是当我尝试第二列时,它没有提供所需的输出。

代码和输出

[psatav]$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f1
$$JOB_ESTD_TIME1='2016-04-16 00:00:00'
[psatav]$ echo '$$JOB_ESTD_TIME2'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f2
 '2016-04-16 20:00:00'

第二个命令应该返回:-

$$JOB_ESTD_TIME2='2016-04-16 20:00:00'

【问题讨论】:

  • 不,不应该
  • @dnit13 :- 我错过了什么?为什么它在第一列而不是第二列工作正常。我已经提到了所需的输出。那么我需要在命令中进行哪些更改?
  • @PravinSatav:-f1-f2 以这种方式工作,只要满足分隔符,它就会准确地打印它之前和之后的值。所以使用-f2 时模式$$JOB_ESTD_TIME2= 会丢失,因为只有'2016-04-16 20:00:00' 是其中的一部分

标签: shell unix cut


【解决方案1】:

你的 OP 中的 cut 命令不会这样工作,你可以像这样使用 awkmultiple delimiters:-

awk -F'[=|]' '{gsub(/ /, "", $2); printf "%s=%s\n", $1, $2}'
awk -F'[=|]' '{gsub(/ /, "", $3); printf "%s=%s\n", $1, $3}'

对于你的情况,

$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F'[=|]' '{ gsub(/ /, "", $2);printf "%s=%s\n", $1, $2 }'
$$JOB_ESTD_TIME1='2016-04-16 00:00:00'

$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F'[=|]' '{ gsub(/ /, "", $3);printf "%s=%s\n", $1, $3 }'
$$JOB_ESTD_TIME1='2016-04-16 20:00:00'

在将每个字段传递给 printf 之前,使用 gsub 删除空格。

【讨论】:

    【解决方案2】:

    您正在做的是将 $$JOB_ESTD_TIME1='2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00' 整个字符串传递给 cut 所以对于 f1 它会削减

    $$JOB_ESTD_TIME1='2016-04-16 00:00:00'
    

    对于 f2,它只削减 '2016-04-16 20:00:00'

    如果你不想使用 awk 并坚持剪切这里是你应该做的

    echo '$$JOB_ESTD_TIME2'=$(echo "'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f2)
    $$JOB_ESTD_TIME2= '2016-04-16 20:00:00'
    
    echo '$$JOB_ESTD_TIME2'=$(echo "'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f1)
    $$JOB_ESTD_TIME2='2016-04-16 00:00:00'
    

    【讨论】:

    • ^ 这样做也不错!
    • 它对我有用。并且也发现了问题所在!
    【解决方案3】:

    您将cut 的分隔符设置为|,因此-f1 会在第一个| 之前剪切所有内容并打印所需的输出。

    但是-f2 会截断第一和第二个| 之间的数据,这就是你得到的。

    您可以使用以下awk 命令来获得所需的输出:

    bash-4.1$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F"=" '{
    split($2,a,"|"); print $1,"=",a[1]}'
    $$JOB_ESTD_TIME1 = '2016-04-16 00:00:00' 
    bash-4.1$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F"=" '{
    split($2,a,"|"); print $1,"=",a[2]}'
    $$JOB_ESTD_TIME1 =  '2016-04-16 20:00:00'
    
    • -F"=" 参数将分隔符设置为 =,因此 $1 将包含 $$JOB_ESTD_TIME1
    • split 函数拆分 $2 (这是其余的 =) 之后的数据,并将其存储在数组 a 中。
    • print 打印 数组中的必填字段。

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 2021-09-11
      • 1970-01-01
      • 2021-06-15
      • 2020-09-14
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 2014-06-06
      相关资源
      最近更新 更多