簡體   English   中英

BASH - 如何讀取文件內容以將結果插入到mysql WHERE子句中

[英]BASH - How to read file contents to insert results into mysql WHERE clause

我正在嘗試創建一個文件(稱為帳戶 )並使用bash腳本(稱之為* name_checker *)循環遍歷每一行並將其轉換為多個字符串以存儲在名為' $ NAMES '的變量中,用於mysql WHERE IN條款

例如:

我的腳本* name_checker *中的查詢是基本的:

SELECT * FROM表WHERE account_name IN('$ NAMES')

IN語句的值需要用逗號分隔並放入單引號中。

我的帳戶文件將是由換行符分隔的名稱:

NAME1

NAME2

NAME3

所以我需要我的腳本(* name_checker *)來刪除換行符並用單引號括起每個名稱並用逗號分隔它們。 運行腳本時所需的結果將是

SELECT * FROM表WHERE account_name IN('NAME1','NAME2','NAME3')

我對此有一些困難,我對使用sed不太熟悉。 感謝幫助!

無需調用外部實用程序即可完成。

cat >Accounts.txt <<XXX
NAME1
NAME2
NAME3
XXX

腳本:

while read x; do NAMES="$NAMES,'$x'"; done <Accounts.txt
NAMES=${NAMES:1}
SQL='SELECT * FROM table WHERE account_name IN ('$NAMES')'
echo "$SQL"

輸出:

SELECT * FROM table WHERE account_name IN ('NAME1','NAME2','NAME3')

或者它甚至可以簡化去除顯式循環

printf -v NAMES ",'%s'" $(<Accounts.txt)
NAMES=${NAMES:1}
echo "$NAMES";

輸出:

'NAME1','NAME2','NAME3'

如果您使用的是bash 4或更高版本,則可以使用mapfile命令(也拼寫為readarray )將整個文件拉入單個數組。 然后,您可以將數組擴展為一個逗號分隔的用戶名字符串。

$ mapfile users < Accounts.txt
$ quotedUsers=( $( printf "'%s' " ${users[@]%?} ) )
$ userString=$( IFS=,; echo "${quotedUsers[*]}" )

你可以嘗試這個..

Accounts.txt

NAME1
NAME2
NAME3

NAME=`awk '{print "-"$0"-"}' Accounts.txt| tr "-" "'" | tr '\n' ',' | sed 's/.$//g'`
echo "$NAME"

產量

'NAME1','NAME2','NAME3'

注 -在SQL代碼中使用變量$ NAME。

names="'$(cat <your file> | sed 's/(\\w)\\n(\\w)/\\1\\', \\'\\2/g)'"

試試嗎?

:d

嘗試將此放入您的查詢中:

echo $NAMES | sed -e "s/\([a-zA-Z]*\)/'\1',/g" -e 's/,$//';

例:

$ NAMES='Martin John Barbera Holly'
$ echo $NAMES | sed -e "s/\([a-zA-Z]*\)/'\1',/g" -e 's/,$//';
'Martin', 'John', 'Barbera', 'Holly'

這會將換行符分隔的條目轉換為單引號,逗號分隔的條目。

var=$(awk '{print "\x27"$0"\x27"}' ORS=, accounts_file)
var="${var%,}"

筆記:

  1. ORS代表輸出記錄分隔符。 它基本上是用於終止awk的每一行輸出的字符(默認值:換行符)
  2. \\x27是單引號的十六進制代碼,以避免與外部單引號對沖突(因為單引號內不能有任何轉義序列)
  3. ${var%,}是一個參數擴展 ,它刪除一個尾隨逗號,因為awk命令會給你一個額外的逗號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM