用第2列剪切命令问题

时间:2016-07-20 10:19:51

标签: shell unix cut

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

代码和输出

[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'

3 个答案:

答案 0 :(得分:3)

OP中的cut命令无法正常工作,您可以像multiple delimiters一样使用awk: -

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'

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

答案 1 :(得分: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'

答案 2 :(得分:1)

您要将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打印出来 数组中的必填字段。