2012-06-15 121 views
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 
+0

有一定是更好的標題 - 請更新您的標題,因此是相關的。 (現在爲-1,因爲前面提到的原因,但稍後可以很容易地修改) – 2012-06-15 03:35:46

+1

將重定向放在循環外部的'$ TARGET',可能是'> $ TARGET'。然後你可以在循環之前丟失'touch'。您的標題行也需要包含引號('echo「#userID,itemId」')。 –

回答

2

相反的set,你可以使用陣列:

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

Perl可能有一個班輪做它。

Awk也可以輕鬆地做到這一點。

我的第一反應是AWK的組合和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}' 
+1

請注意[UUOC Award](http://partmaps.org/era/unix/award.html)。 –

+0

公平評論 - 從來不知道我可以得到它的獎勵;-) – John3136

+0

我將不得不在sed和awk上找到教程。感謝這個例子。 – contrapositive

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 
$ 
2

下面將從infile.dat打印列1和2。用 替換您想要的編號列的逗號分隔列表。

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