Bash, как печатать для вывода цикла в одну строку? - PullRequest
3 голосов
/ 29 февраля 2012

Хотел бы я, чтобы кто-нибудь помог мне с этим,

как мне вывести вывод цикла for в одну строку?

for i in `cat file.csv`
do
echo $i 
done

Я пытаюсь получить список чисел из файла file.csv для генерации оператора массового удаления mysql.

delete FROM Recordtable WHERE DataID IN ('93041', '93031' ...etc);

и цель здесь - загрузить каждые 1000 записей в один оператор удаления

Ваша помощь высоко ценится

Ответы [ 6 ]

5 голосов
/ 29 февраля 2012

Если вы хотите цикл, вы можете использовать

for i in ($<file.csv)
do
  echo -n "$i "
done

Опция -n для echo подавляет перевод строки.


Вы можете напечатать весь файл в одну строку с echo $(<file.csv).

Но это может лучше удовлетворить ваши потребности:

awk '{ printf $0 " " } NR%1000 == 0 { print "" }' file

При этом каждая строка будет напечатана с пробелом. Он будет печатать новую строку всякий раз, когда номер строки делится на 1000; после каждой 1000-й строки.


Добавлено: для печати каждой строки в скобках вы можете использовать

awk '{ printf $0 " " } NR%1000 == 0 { print "" }' file | sed 's/.*/(&)/'

Команда sed ищет любые символы (.*) и заменяет их на открытое слово, найденные символы (то есть на всю строку) и близкое слово.

2 голосов
/ 29 февраля 2012

Кажется, file.csv содержит DataID в одном столбце. Если это так, вы можете сгенерировать запрос следующим образом:

echo delete FROM Recordtable WHERE DataID IN \(0$(cat file.csv | tr -cs '[:digit:]' ',')0\)\;

Поскольку файл содержит только целые числа (DataID выглядит как int), нет необходимости заключать его в одинарные кавычки.

$ cat data
123
241114
43243
35745
656
346   456


$echo delete FROM Recordtable WHERE DataID IN \(0$(cat data | tr -cs '[:digit:]' ',')0\)\;
delete FROM Recordtable WHERE DataID IN (0,123,241114,43243,35745,656,346,456,0);

Здесь 0 имеет дело с лидированием и трейлингом , с.

1 голос
/ 29 февраля 2012

Из школы ответов «просто потому что»:

tr $'\n' ' ' < file.csv
1 голос
/ 29 февраля 2012

Вы можете использовать Perl.

perl -lne '$a .= $_ }{ print $a' file.csv

-l удалит новые строки и добавит новую строку к print. -n будет читать содержимое файла аргумента. Помните, что если в файле нет добавленных пробелов, вы можете добавить его, например, $a .= " $_".

Я предполагаю, что вы собираетесь куда-то передать этот ввод для выполнения SQL-запроса. Я не могу помочь, но думаю, что это может быть лучше сделано с DBI .

1 голос
/ 29 февраля 2012
BULK_DELETE_SQL=/tmp/bulkdelete.sql
rm -f ${BULK_DELETE_SQL}
COMMIT_COUNT=0
COMMIT_LIMIT=1000
NUMLIST=""
COMMA=""
for NUM in `cat file.csv` 
do
    NUMLIST="${NUMLIST}${COMMA}${NUM}"
    COMMA=","
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        SQLSTMT="delete FROM Recordtable WHERE DataID IN (${NUMLIST});"
        echo ${SQLSTMT} >> ${BULK_DELETE_SQL}
        NUMLIST=""
        COMMA=""
        COMMIT_COUNT=0
    fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
    SQLSTMT="delete FROM Recordtable WHERE DataID IN (${NUMLIST});"
    echo ${SQLSTMT} >> ${BULK_DELETE_SQL}
fi
mysql -u... -p... < ${BULK_DELETE_SQL}
rm -f ${BULK_DELETE_SQL}

При этом будет написан один сценарий SQL, который создаст 1000 идентификаторов данных для каждого оператора DELETE.

Он подключится к mysql только один раз и выполнит все УДАЛЕНИЯ, 1000 DataID одновременно.

Если в файле file.csv имеется 6247 идентификаторов данных, то в последней строке должно быть 247 идентификаторов данных

Если в файле file.csv имеется 247 идентификаторов данных, то единственная строка должна содержать 247 идентификаторов данных

Дай попробовать !!!

1 голос
/ 29 февраля 2012

Вы можете сделать:

echo $(cat file.csv)

или

cat file.csv | xargs

или, наконец,

$ cat /tmp/l.csv
1;2;3;4;5;6
7;8;9;10;11
$ echo $(< /tmp/l.csv)
1;2;3;4;5;6 7;8;9;10;11
$ echo $(cat /tmp/l.csv) | perl -pe 's@(;|\n)@,@g'
1,2,3,4,5,6,7,8,9,10,11,
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...