2012-06-15 2 views
0

я соединял этот скрипт, чтобы сделать две вещи:Взорвать к массиву

  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 в настоящее время по указанной причине, но это может быть легко изменено позже.) –

+1

Поместите перенаправление в '$ TARGET' за пределы цикла, возможно, как'> $ TARGET'. Затем вы можете потерять «прикосновение» перед циклом. В строке заголовка должны быть указаны кавычки ('echo '# userID, itemId" '). –

ответ

2

Вместо того set, вы может использовать массив:

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

У Perl, возможно, есть 1 вкладыш, чтобы сделать это.

Возможно, 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] (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

Следующая напечатает столбцы 1 и 2 из infile.dat. Замените список нумерованных столбцов, разделенных запятыми.

awk 'BEGIN { IFS='::'; OFS=","; } { print $1, $2 }' infile.dat > infile.csv 
Смежные вопросы