使用Bash脚本处理文件

时间:2015-01-29 09:26:50

标签: bash

这是我的第一篇文章,请原谅我格式化..我确实试过

我有一个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"

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!