爆炸到阵列

时间:2012-06-15 03:25:12

标签: bash shell replace explode

我把这个shell脚本放在一起做两件事:

  1. 更改数据文件中的分隔符(' ::'至','在这种情况下)
  2. 选择我想要的列并将它们附加到新文件
  3. 它有效,但我想要一个更好的方法来做到这一点。我特别想找到一种将每一行爆炸成数组的替代方法。使用命令行参数似乎不太合适。任何评论都欢迎。

        # Takes :: separated file as 1st parameters
        SOURCE=$1
    
        # create csv target file
        TARGET=${SOURCE/dat/csv}
        touch $TARGET
    
        echo #userId,itemId > $TARGET
    
        IFS=","
        while read LINE
        do
            # Replaces all matches of :: with a ,
            CSV_LINE=${LINE//::/,}
            set -- $CSV_LINE
            echo "$1,$2" >> $TARGET
        done < $SOURCE
    

4 个答案:

答案 0 :(得分:2)

您可以使用数组代替set

arr=($CSV_LINE)
echo "${arr[0]},${arr[1]}"

答案 1 :(得分:2)

以下内容将打印infile.dat中的第1列和第2列。用。。。来代替 您想要的编号列的逗号分隔列表。

awk 'BEGIN { IFS='::'; OFS=","; } { print $1, $2 }' infile.dat > infile.csv

答案 2 :(得分:1)

Perl可能只有1个衬垫。

Awk也可能很容易做到。

我的第一反应是awk和sed的组合:

  • 用于转换分隔符的Sed
  • 处理特定列的awk
  
cat inputfile | sed -e 's/::/,/g' | awk -F, '{print $1, $2}'
# Or to avoid a UUOC award (and prolong the life of your keyboard by 3 characters
sed -e 's/::/,/g' inputfile | awk -F, '{print $1, $2}'

答案 3 :(得分:1)

awk确实是这里工作的正确工具,它是一个简单的单行。

$ cat test.in
a::b::c
d::e::f
g::h::i
$ awk -F:: -v OFS=, '{$1=$1;print;print $2,$3 >> "altfile"}' test.in
a,b,c
d,e,f
g,h,i
$ cat altfile
b,c
e,f
h,i
$