Использование awk / sed для печати полей внутри данного csv в Bash - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь использовать комбинацию awk / sed для печати определенных полей в данном csv. Я сталкиваюсь с проблемой получения awk для распознавания заданных параметров (например, ./printcsv.sh 3 5 - параметры 3 и 5 и пытаюсь распечатать столбцы 3 и 5 csv через awk) в коде.

#! /bin/bash

read -p "What file would you like to print? " file
read -p "What directory is this file located in? " directory

cd $directory

touch readcsv.txt

for (( i = 1; i <= $#; i=i+1 ))
    do
        cat $file | awk -F "," -v var=${i} 'NR==2 {print $var }' "$directory"/"$file" >> readcsv.txt

    done

cat readcsv.txt

rm readcsv.txt

Я подумал или создал временный файл .txt, в который я бы добавил печатные поля, чтобы отследить этот файл .txt для чтения, но у меня возникли проблемы (возможно, из-за недостаток знаний sed) о создании таблицы в файле, так как на выходе это всего два столбца, расположенных один за другим (очень длинный столбец). Кроме того, я не знаю, заключается ли проблема в «for» l oop, которое я создал, или в том, как я пытаюсь расширить переменную «i», но даже если я задаю свои параметры, чтобы сказать 3 и 5, я надеюсь, что $ 1 будет затем преобразован в параметр 3 (следовательно, столбец 3 в CSV), вместо этого он все еще переводится в столбец 1 в команде awk.

Точно так же, как система отсчета, я очень новичок в Bash, все самоучки проводятся через онлайн-курсы, которые могут только так сильно помочь, пока вы не попадете на примеры, не связанные с курсом.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

попробуйте использовать встроенные модули перед тем, как бросить свои собственные.

например, cut сделает то, что вам нужно, уже с

$ cut -d, -f3,4,5 file

в вашем скрипте, если скрипт входным аргументом является «3,4,5», вы можете использовать это

cut -d, -f"$@" "$file"

будет отображать выбранные столбцы, не нужно создавать временный файл. В качестве дополнительного преимущества, он также поддерживает диапазоны, поэтому вы также можете использовать формат ввода «3-5».

1 голос
/ 10 марта 2020

до print columns 3 and 5 of a csv via awk это все, что вам нужно:

num1=3
num2=5

awk -v list="$num1 $num2" '
    BEGIN {
        n = split(list,cols)
        FS=OFS=","
    }
    {
        for (i=1; i<=n; i++) {
            printf "%s%s", $(cols[i]), (i<n ? OFS : ORS)
        }
    }
' file

и, в случае необходимости, для печати от 3 до 5 будет:

awk -v beg="$num1" -v end="$num2" '
    BEGIN {
        FS=OFS=","
    }
    {
        for (i=beg; i<=end; i++) {
            printf "%s%s", $i, (i<end ? OFS : ORS)
        }
    }
' file

. при условии, что у вас очень простой CSV, в противном случае смотрите Whats-the-самый надежный способ-эффективно-parse-csv-using-awk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...