这是我的第一篇文章,请原谅我格式化..我确实试过
我有一个txt文件,它是分隔符,看起来像这样
9574575052 2.16.840.1.113883.6.5.2.1 V87.41
9574582051 2.16.840.1.113883.6.5.2.1 042|038.9|995.91
9574583059 2.16.840.1.113883.6.5.2.1 275.42|011.90
我希望得到一个像这样分开的输出标签
9574575052 2.16.840.1.113883.6.5.2.1 V87.41
9574582051 2.16.840.1.113883.6.5.2.1 042
9574582051 2.16.840.1.113883.6.5.2.1 038.9
9574582051 2.16.840.1.113883.6.5.2.1 995.91
9574583059 2.16.840.1.113883.6.5.2.1 275.42
9574583059 2.16.840.1.113883.6.5.2.1 011.90
使用我的脚本我将输出作为
9574575052 2.16.840.1.113883.6.5.2.1 V87.41
9574575052 2.16.840.1.113883.6.5.2.1 V87.41
9574575052 2.16.840.1.113883.6.5.2.1 V87.41
9574582051 2.16.840.1.113883.6.5.2.1 042
9574582051 2.16.840.1.113883.6.5.2.1 038.9
9574582051 2.16.840.1.113883.6.5.2.1 995.91
9574583059 2.16.840.1.113883.6.5.2.1 275.42
9574583059 2.16.840.1.113883.6.5.2.1 011.90
第一行是重复两次,我不知道我哪里错了。经过调试后我明白当bash处理第一行时,f2和f3有相同的文字和f1 ...怎么能我纠正了这个。或者我的方法本身是错的?
以下是我的剧本
while read line; do
file=$(echo $line | cut -d' ' -f1,2)
wrd=$(echo $line | cut -d' ' -f3)
cd1=$(echo $wrd | cut -d'|' -f1)
cd2=$(echo $wrd | cut -d'|' -f2)
cd3=$(echo $wrd | cut -d'|' -f3)
if [ "$cd3" != "" ]; then
echo $file $cd1
echo $file $cd2
echo $file $cd3
else
echo $file $cd1
echo $file $cd2
fi
done < "$1"
答案 0 :(得分:0)
您可以使用awk执行此操作:
awk -F'[|\t]' -vOFS="\t" '{for(i=3;i<=NF;++i)print $1,$2,$i}' file
这会将输入字段分隔符设置为制表符或管道,将输出分隔符设置为制表符。它循环遍历最后一个字段(从3到最后),每个字段与第一个和第二个字段一起打印。
对于记录,在shell中很少需要编写自己的while read
循环并使用cut
。这项工作的正确工具是awk!