我正在使用以下脚本来生成具有如下格式的文件:
abc efg|hig
yxf xnc
xbs xnd|shc|ehc|xoc
我希望输出像这样:
abc efg
abc hig
yxf xnc
xbs xnd
xbs shc
xbs ehc
xbs xoc
,脚本如下:
while read line
do
line1=$(echo "$line" | awk '{print $1}')
line2=$(echo "$line" | awk '{print $2}')
arr=$(echo $line2 | tr "|" "\n")
for x in $arr
do
echo -e "$x \t$line1\n"
done
done < FBC.txt
但是我得到的结果混合了两个变量。如:
abefgch
abc hig
yxxncf
xxndbs
xbs shc
xbehcs
xbs xoc
答案 0 :(得分:0)
此处尝试将您的意图解释为针对POSIX sh的正确脚本(如果您实际上是针对ksh,bash或zsh,则可以使用数组而不是覆盖参数列表):< / p>
#!/bin/sh
set -f
while unset IFS; read -r line1 line2 rest; do
IFS='|'
for x in $line2; do
printf '%s \t%s\n' "$x" "$line1"
done
done <FBC.txt
重要说明:
set -f
使用可将文件匹配为通配符的数据使其安全。unset IFS
在第一个read
将输入字段分隔符设置为其默认值之前,按空格或制表符分割line1和line2变量。 (&#34; line2&#34;变量后面的内容进入&#34; rest&#34;变量,未使用)。IFS='|'
确保for x in $line2
按管道字符拆分。printf
而不是echo
可确保您的脚本不依赖于与POSIX规范不同的行为。答案 1 :(得分:0)
你可以在awk中完全完成:
#!/usr/bin/awk -f
{
n = split($2, a, "|");
for (i = 1; i <= n; i++)
printf("%s %s\n", $1, a[i])
}