Преобразование файлов каталога txt в полезный объединенный файл csv с соответствующими именами столбцов

Не пытайтесь использовать echoсо сложными данными.

Далее используется документ здесь -:

cat <<END_SQL
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL

Если вам нужно передать это команде, такой как mysql(, это команда Hive SQL, но я не знаю, как обычно называется клиент Hive, поэтому я использую mysqlв примерах):

cat <<END_SQL | mysql
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL

Если нужно передать без расширения переменных:

cat <<'END_SQL' | mysql
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL

Использование здесь -документа также позволяет писать более читаемый код (более короткие строки):

cat <<'END_SQL' | mysql
LOAD DATA INPATH '$i'
INTO TABLE transient.url_log_201803
     PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL

Обратите внимание, что содержимое документа и (, что более важно, )конечный тег(END_SQLнад )не должны иметь отступ:

for...some loop range...; do
    cat <<END_SQL | mysql
LOAD DATA INPATH '$i'
INTO TABLE transient.url_log_201803
     PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
done

Если конечный тег имеет отступ, оболочка не найдет его, и вы получите сообщение об ошибке о том, что здесь -документ завершается концом файла.

0
07.10.2019, 16:37
2 ответа

Вы хотите pasteвместоcat:

paste -d' ' */*/*/*/allMovement_Regressors.txt | tr -s '[:blank:]' ',' > ofile.csv
0
28.01.2020, 02:29

Для создания отдельных файлов csv -:

$ find /Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.txt' \
-exec bash -c 'tr -s "[:blank:]" "," < "$1" > "${1%.txt}.csv"' tocsv {} \;

«tocsv» будет отображаться в вашем списке процессов как имя сценария bash -в файле exec.

Если вы знаете количество каталогов с «allMovement _Regressors.txt», вы можете написать строку заголовка -следующим образом (заменить X на правильное число):

printf '%s,' {1..X}_{1..12} | sed 's/,$/\n/' > ofile.csv

И собрать их воедино:

$ find /Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.csv' -print0 \
| sort -z \
| xargs -0 paste \
| tr '\t' ',' >> ofile.csv

Обратите внимание, что перед pasteобъединением файлов файлы будут отсортированы по номерам. Я использую здесь -print0, потому что в ваших именах файлов есть пробелы. pasteбудет разделять столбцы символом табуляции -, который вам не нужен в вашем CSV, поэтому нам также нужно заменить его.

Обновление

@bu5hman ответил, как создать заголовок. Я полностью украду это! Обязательно проголосуйте за ответ @bu5hman, если вам нравится мой:-)

Объедините оба наших ответа, напишите сценарий thingy.sh, который вы можете передать-exec:

#!/bin/bash
t=$(echo "$1" | grep -Po "(?<=/)[0-9]+(?=/)")
u=$(echo 1_$(seq -s " ${t}_" $(cat "$1" | awk "{print NF}")))

sed "i \\$u" "$1" \
| tr -s "[:blank:]" "," > "${1%.txt}.csv"

Затем подайте его на-exec:

find Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.txt' \
-exec /path/to/thingy.sh {} \;

А затем соедините вещи с моей второйfind-командой.

1
28.01.2020, 02:29

Теги

Похожие вопросы