bash如何将循环输出打印成一行?

时间:2012-02-28 22:11:42

标签: mysql perl bash awk

我希望有人可以帮助我,

如何将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 个答案:

答案 0 :(得分:5)

如果您想要循环,可以使用

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

-n的{​​{1}}选项会抑制换行符。


您可以使用echo在一行中打印整个文件。

但这可能会更好地满足您的需求:

echo $(<file.csv)

这将打印每一行后跟一个空格。只要行号可被1000整除,它就会打印换行符;也就是说,在每1000行之后。


已添加:要在括号内打印每一行,您可以使用

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

awk '{ printf $0 " " } NR%1000 == 0 { print "" }' file | sed 's/.*/(&)/' 命令搜索任何字符(sed)并用open-paren替换它们,它找到的字符(即整行)和close-paren。 / p>

答案 1 :(得分:2)

似乎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处理领先和尾随,

答案 2 :(得分:1)

你可以这样做:

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

答案 3 :(得分:1)

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脚本,每个DELETE语句将创建1000个DataID。

它只会连接到mysql一次,并且一次执行所有DELETE,1000个DataID。

如果file.csv中有6247个DataID,那么最后一行应该有247个DataID

如果file.csv中有247个DataID,那么唯一的一行应该有247个DataID

试一试!!!

答案 4 :(得分:1)

你可以使用perl。

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

-l会移除换行符,并会向print添加换行符。 -n将读取参数文件内容。请注意,如果文件中不存在添加的空格,您可以添加它,例如$a .= " $_"

我假设您要将此输入传递到某处以执行SQL查询。我不禁想到用DBI可以做得更好。

答案 5 :(得分:1)

来自“正因为”的回答学校:

tr $'\n' ' ' < file.csv