如何交换 .sql 文件中的两组行?

如何交换 .sql 文件中的两组行?

我有一个包含各种语句的转储文件INSERT。该文件看起来像

start_lines

INSERT INTO table1234 …
INSERT INTO table1234 …
INSERT INTO table1234 …

INSERT INTO table7890 …
INSERT INTO table7890 …
INSERT INTO table7890 …

 end_lines

我需要所有的INSERT INTO table7890陈述都位于INSERT INTO table1234陈述之上。我想将所有start_linesend_lines保持在切换发生之前的相同位置。因此,例如,如果start_lines占用第 3 行到第 18 行,则在切换插入语句后,它们应该继续出现第 3 行到第 18 行。结束行同上。

如何切换语句组?

答案1

最简单的方法是读取文件两次,第一次保存段落,第二次交换它们,例如awk(在段落模式下):

awk -v RS= -v ORS='\n\n' 'NR==FNR{
if (/table1234/) {one=$0} else if (/table7890/){two=$0}
next
}
{
if (/table1234/) {$0=two} else if (/table7890/){$0=one}
}
1' infile infile

如果重要的话,这将打印一个尾随空行......


ol' 的另一种方法ed在这种特殊情况下确实有效:

ed -s infile <<\IN
g/INSERT INTO table1234/d
-1r !grep -F 'INSERT INTO table7890' infile
+1,$g/INSERT INTO table7890/d
-1r !grep -F 'INSERT INTO table1234' infile
,p
q
IN

答案2

有多种方法可以做到这一点,但我能看到的最简单的方法是grep

grep -v table1234 test.sql; grep table1234 test.sql

首先输出除table1234行之外的所有内容,然后仅输出table1234行。

如果需要,您还可以将其重定向到新文件:

(grep -v table1234 test.sql; grep table1234 test.sql) > test2.sql

相关内容