当字符串中包含管道符号|时,如何拆分字符串。 我想把它们分割成数组。

我试着

echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'

这很好。如果我的字符串是像“12|23|11”,那么我如何把它们分割成一个数组?


当前回答

code

awk -F"|" '{split($0,a); print a[1],a[2],a[3]}' <<< '12|23|11'

输出

12 23 11

其他回答

echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'

你有没有试过:

echo "12|23|11" | awk '{split($0,a,"|"); print a[3],a[2],a[1]}'

我不喜欢回声“…”| awk…解决方案,因为它调用不必要的fork和execsystem调用。

我更喜欢迪米特里的解决方案

awk -F\| '{print $3 $2 $1}' <<<'12|23|11'

或者更短一点的版本:

awk -F\| '$0=$3 $2 $1' <<<'12|23|11'

在这种情况下,输出记录放在一起是一个真条件,所以它被打印出来。

在这个特定的情况下,stdin重定向可以通过设置一个awk内部变量来避免:

awk -v T='12|23|11' 'BEGIN{split(T,a,"|");print a[3] a[2] a[1]}'

我使用ksh相当长一段时间,但在bash中,这可以通过内部字符串操作来管理。在第一种情况下,原始字符串被内部终止符分割。在第二种情况下,假设字符串总是包含由一个字符分隔符分隔的数字对。

T='12|23|11';echo -n ${T##*|};T=${T%|*};echo ${T#*|}${T%|*}
T='12|23|11';echo ${T:6}${T:3:2}${T:0:2}

所有情况下的结果都是

112312

请说得更具体些!你说“它不管用”是什么意思? 发布准确的输出(或错误消息),你的OS和awk版本:

% awk -F\| '{
  for (i = 0; ++i <= NF;)
    print i, $i
  }' <<<'12|23|11'
1 12
2 23
3 11

或者,使用split:

% awk '{
  n = split($0, t, "|")
  for (i = 0; ++i <= n;)
    print i, t[i]
  }' <<<'12|23|11'
1 12
2 23
3 11

编辑:在Solaris上,您需要使用POSIX awk (/usr/xpg4/bin/awk)才能正确处理4000个字段。

code

awk -F"|" '{split($0,a); print a[1],a[2],a[3]}' <<< '12|23|11'

输出

12 23 11