重击
输入:猫测试
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
对于程序员来说,这可能很简单。 谢谢。
答案 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