如何迭代bash中的定界值

时间:2018-07-20 16:21:13

标签: bash for-loop awk sed while-loop

重击

输入:猫测试

  1 a;b;c;d
  2 a;b;c;d
  3 a;b;c;d

所需的输出是:

  1 a
  1 b
  1 c
  1 d
  2 a
  2 b
  2 c
  2 d
  3 a
  3 b
  3 c
  3 d 

对于程序员来说,这可能很简单。 谢谢。

3 个答案:

答案 0 :(得分:3)

解决方案第一: 。能否请您尝试以下操作。

awk -F'[ ;]' '{for(i=2;i<=NF;i++){print $1,$i}}' Input_file

第二解决方案: :现在也添加了另一个awk

awk '{gsub(/;/,ORS $1 OFS)} 1'  Input_file

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -r 's/^((\s*\S+\s*)[^;]*);/\1\n\2/;P;D' file

在每个;前面加换行符,然后再替换键。

答案 2 :(得分:0)

直接外壳:

IFS=" ;"
shopt noglob # or set -f
while read -r line; do 
  set -- $line; a=$1; shift
  for b; do printf '%s %s\n' "$a" "$b"; done
done
# if data never contains backslash can omit -r from read
# if data never contains glob patterns (? * [..] etc) can omit set -f
# if data never contains backslash and first col never begins with hyphen
# can replace printf with echo "$a" "$b" 

聪明的外壳, if 第一列从不包含百分比或反斜杠:

IFS=" ;"
shopt noglob # or set -f
while read -r line; do 
  set -- $line; a=$1; shift
  printf "$a %s\n" "$@"
done
# read -r and set -f as above

这两个都离开了IFS和(也许)noglob改变了;如果这是脚本的全部或最后部分,还是使用()的函数,则这些更改将在本地实例上进行并被放弃。否则,要么显式保存和恢复,要么用()包围,以便将其丢弃。

类似地,这两个都破坏了位置参数,这通常仅在脚本或函数中才重要;如果随后需要这些,请保存并还原它们,或者在bash或ksh中仅使用单独的显式数组变量:

IFS=" ;"
shopt noglob # or set -f
while read -ra ary; do
  a=${ary[0]}; unset ary[0]
  for b in "${ary[@]}"; do printf '%s %s\n' "$a" "$b"; done
  # or 
  printf "$a %s\n" "${ary[@]}"
done