剪切第二列的命令问题
cut command issue with 2nd column
我正在尝试从字符串中删除某些值。它在第一列中按预期工作,但是当我尝试在第二列中时,它没有给出所需的输出。
代码与输出
[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'
第二个命令应该 return :-
$$JOB_ESTD_TIME2='2016-04-16 20:00:00'
您正在将 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(,a,"|"); print ,"=",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(,a,"|"); print ,"=",a[2]}'
$$JOB_ESTD_TIME1 = '2016-04-16 20:00:00'
-F"="
参数将分隔符设置为 =
,因此 </code> 将包含
<code>$$JOB_ESTD_TIME1
。
split
函数拆分 </code> (这是其余的
<code>=
) 之后的数据并将其存储在数组 a
. 中
print
打印
数组中的必填字段。
您的 OP 中的 cut
命令不会那样工作,您可以像这样将 awk
与 multiple delimiters
一起使用:-
awk -F'[=|]' '{gsub(/ /, "", ); printf "%s=%s\n", , }'
awk -F'[=|]' '{gsub(/ /, "", ); printf "%s=%s\n", , }'
对于你的情况,
$ 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(/ /, "", );printf "%s=%s\n", , }'
$$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(/ /, "", );printf "%s=%s\n", , }'
$$JOB_ESTD_TIME1='2016-04-16 20:00:00'
在将每个字段传递给 printf
之前使用 gsub
删除空格。
您正在做的是将 $$JOB_ESTD_TIME1='2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'
整个字符串传递给剪切,因此对于 f1 它会剪切
$$JOB_ESTD_TIME1='2016-04-16 00:00:00'
并且对于 f2 它只削减 '2016-04-16 20:00:00'
如果你不想使用 awk 并坚持 cut 这里是你应该做的
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'
我正在尝试从字符串中删除某些值。它在第一列中按预期工作,但是当我尝试在第二列中时,它没有给出所需的输出。
代码与输出
[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'
第二个命令应该 return :-
$$JOB_ESTD_TIME2='2016-04-16 20:00:00'
您正在将 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(,a,"|"); print ,"=",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(,a,"|"); print ,"=",a[2]}'
$$JOB_ESTD_TIME1 = '2016-04-16 20:00:00'
-F"="
参数将分隔符设置为=
,因此</code> 将包含 <code>$$JOB_ESTD_TIME1
。split
函数拆分</code> (这是其余的 <code>=
) 之后的数据并将其存储在数组a
. 中
print
打印 数组中的必填字段。
您的 OP 中的 cut
命令不会那样工作,您可以像这样将 awk
与 multiple delimiters
一起使用:-
awk -F'[=|]' '{gsub(/ /, "", ); printf "%s=%s\n", , }'
awk -F'[=|]' '{gsub(/ /, "", ); printf "%s=%s\n", , }'
对于你的情况,
$ 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(/ /, "", );printf "%s=%s\n", , }'
$$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(/ /, "", );printf "%s=%s\n", , }'
$$JOB_ESTD_TIME1='2016-04-16 20:00:00'
在将每个字段传递给 printf
之前使用 gsub
删除空格。
您正在做的是将 $$JOB_ESTD_TIME1='2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'
整个字符串传递给剪切,因此对于 f1 它会剪切
$$JOB_ESTD_TIME1='2016-04-16 00:00:00'
并且对于 f2 它只削减 '2016-04-16 20:00:00'
如果你不想使用 awk 并坚持 cut 这里是你应该做的
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'