0

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

  1. 更改数据文件中的分隔符(在这种情况下,将“::”更改为“,”)
  2. 选择我想要的列并将它们附加到一个新文件中

它有效,但我想要一个更好的方法来做到这一点。我特别想找到一种将每一行分解成数组的替代方法。使用命令行参数似乎不是要走的路。欢迎任何评论。

    # 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

4 回答 4

2

代替set,您可以使用数组:

arr=($CSV_LINE)
echo "${arr[0]},${arr[1]}"
于 2012-06-15T11:26:32.943 回答
2

以下将打印第 1 列和第 2 列infile.dat。替换为您想要的编号列的逗号分隔列表。

awk 'BEGIN { IFS='::'; OFS=","; } { print $1, $2 }' infile.dat > infile.csv
于 2012-06-15T13:57:55.910 回答
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}'
于 2012-06-15T03:30:32.010 回答
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
$
于 2012-06-15T12:22:34.833 回答