2014-04-16 151 views
0

我有一个文本文件,每行有三列文本(字符串)。我想创建一个SQL插入命令,将三个字符串中的每一个替换为一个骨架SQL命令。我在骨架脚本中放置了标记,并使用SED s/placemarker1/first string /但没有成功。有没有更简单的方法来完成这项任务。我用管道来重复“第二个字符串”的过程等。我实际上使用awk来获取字段,但无法转换为实际值。从文本文件到另一个字符串的字符串替换

enter code here 
    for i in [ *x100* ]; do 
    if [ -f "$i" ]; then { 
     grep -e "You received a payment" -e "Transaction ID:" -e "Receipt No: " $i >> ../temp 
     cat ../temp | awk 'NR == 1 {printf("%s\t",$9)} NR == 2 {printf("%s\t",$9)} NR == 3 {printf("%s\n",$3)}' | awk '{print $2,$1,$3}' | sed 's/(/ /' | sed 's/)./ /' >> ../temp1 
     cat temp1 | awk 'email="$1"; transaction="$2"; ccreceipt="$3";' 
     cat /home/linux014/opt/skeleton.sql | sed 's/EMAIL/"$email"/' | sed 's/TRANSACTION/"$transaction"/' | sed 's/CCRECEIPT/"$ccreceipt"/' > /home/linux014/opt/new-member.sql 
     rm -f ../temp 
    } fi 
    done 

我无法弄清楚如何获得的,而不是插入我的字符串变量的名称值。

样品入口(一行只):

[email protected] 2w4e5r6t7y8u9i8u7 1111-2222-3333-4444 

样品实际输出:

INSERT INTO users (email,paypal_tran,CCReceipt) VALUES ('"$email"','"$transaction"','"$ccreceipt"'); 

优选输出:

INSERT INTO users (email,paypal_tran,CCReceipt) VALUES ('[email protected]','2w4e5r6t7y8u9i8u7','1111-2222-3333-4444'); 
+2

示例输入和预期输出将帮助 –

回答

2
awk '{print "INSERT INTO users (email,paypal_tran,CCReceipt) VALUES"; print "(\x27"$1"\x27,\x27"$2"\x27,\x27"$3"\x27);"}' input.txt 

您的样本输入转换为优选的输出。它应该适用于多线路输入。

编辑

您使用该行中的变量:

cat temp1 | awk 'email="$1"; transaction="$2"; ccreceipt="$3";' 

只对AWK和该命令可见。它们不是shell变量。 此外,在您的sed命令删除这些单引号,那么你可以得到的值:

sed "s/EMAIL/$email/" 
+0

我正在尝试这种方法,但我仍然收到$ email而不是它的值[email protected]。我似乎无法得到值,但输入的名称。我的任务必须是错误的。 – user3386373

+0

如果您有一个文件,其内容与您发布为样本输入的文件类似 – Ashkan

+0

谢谢。这似乎解决了我的问题。我很欣赏努力和代码! – user3386373

1

你可以试试这个bash

while read email transaction ccreceipt; do echo "INSERT INTO users (email,paypal_tran,CCReceipt) VALUES ('$email','$transaction','$ccreceipt');"; done<inputfile 

inputfile中:

[email protected] 2w4e5r6t7y8u9i8u7 1111-2222-3333-4444 
[email protected] 2dsdsda53563u9i8u7 3333-4444-5555-6666 

测试:

sat:~$ while read email transaction ccreceipt; do echo "INSERT INTO users (email,paypal_tran,CCReceipt) VALUES ('$email','$transaction','$ccreceipt')"; done<inputfile 
INSERT INTO users (email,paypal_tran,CCReceipt) VALUES ('[email protected]','2w4e5r6t7y8u9i8u7','1111-2222-3333-4444') 
INSERT INTO users (email,paypal_tran,CCReceipt) VALUES ('[email protected]','2dsdsda53563u9i8u7','3333-4444-5555-6666') 
+0

谢谢你的帮助。优秀的方法。 – user3386373

+0

@ user3386373:不要忘记对你认为有用的答案进行投票,即使它不是那些一开始就解决问题的人);) –

0
You can write a small procedure for this 

CREATE PROCEDURE [dbo].[appInsert]-- 
@string VARCHAR(500) 
AS 
BEGIN 

DECLARE @I INT 
DECLARE @SubString VARCHAR(500) 
SET @String = '[email protected] 2w4e5r6t7y8u9i8u7 1111-2222-3333-4444' 
SET @I = 1 
SET @String = REPLACE(@String, ' ', '`~`') 

    WHILE @I > 0 
     BEGIN 
     SET @SubString = SUBSTRING (REVERSE(@String), 1, (CHARINDEX('`~`', REVERSE(@String)) - 1)) 
     SET @String = SUBSTRING(@String, 1, LEN(@String) - CHARINDEX('`~`', REVERSE(@String)) - 2) 
     print REVERSE(@SubString) + ' === ' + @String 
     SET @i = CHARINDEX('`~`', @String) 
     END 

END 
相关问题