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

我试着

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

这很好。如果我的字符串是像“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]}'

我知道这是个老问题,但我想也许有人喜欢我的把戏。特别是因为这个解决方案不局限于特定数量的项目。

# Convert to an array
_ITEMS=($(echo "12|23|11" | tr '|' '\n'))

# Output array items
for _ITEM in "${_ITEMS[@]}"; do
  echo "Item: ${_ITEM}"
done

输出将是:

Item: 12
Item: 23
Item: 11

挑战:用空格解析和存储分割的字符串,并将它们插入变量中。

解决方案:最好的和简单的选择为您将转换字符串列表为数组,然后将其解析为具有索引的变量。下面是一个转换和访问数组的示例。

示例:解析每行的磁盘空间统计信息:

sudo df -k | awk 'NR>1' | while read -r line; do
   #convert into array:
   array=($line)

   #variables:
   filesystem="${array[0]}"
   size="${array[1]}"
   capacity="${array[4]}"
   mountpoint="${array[5]}"
   echo "filesystem:$filesystem|size:$size|capacity:$capacity|mountpoint:$mountpoint"
done

#output:
filesystem:/dev/dsk/c0t0d0s1|size:4000|usage:40%|mountpoint:/
filesystem:/dev/dsk/c0t0d0s2|size:5000|usage:50%|mountpoint:/usr
filesystem:/proc|size:0|usage:0%|mountpoint:/proc
filesystem:mnttab|size:0|usage:0%|mountpoint:/etc/mnttab
filesystem:fd|size:1000|usage:10%|mountpoint:/dev/fd
filesystem:swap|size:9000|usage:9%|mountpoint:/var/run
filesystem:swap|size:1500|usage:15%|mountpoint:/tmp
filesystem:/dev/dsk/c0t0d0s3|size:8000|usage:80%|mountpoint:/export
echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'

应该工作。

请说得更具体些!你说“它不管用”是什么意思? 发布准确的输出(或错误消息),你的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个字段。