【发布时间】:2020-12-28 01:19:23
【问题描述】:
我看到这里得到了回答: Moving matching lines in a text file using sed 和这里: How to move specified line in file to other place with regexp match (bash script)?
但我在为我的案例实施它时遇到了问题。
我有一个 .csv 文件,其中包含:
Unit Tests
Model: A
Tue Sep 8 22:52:24 MDT 2020
User: br
Files Used:
DATA FILE - /path/to/file/data.txt
TEST TARBALL - /path/to/tarball/my_test.tar.bz2
Results:
Module,Test Suite,Total Tests,Tests Passed,Tests Failed,Pass Rate
Individual Test Run,ClientTests,15,15,0,100.00%
,GraphTests,37,26,11,70.00%
Mean Pass Rate for All Tests,,52,41,11,78.85%
我需要移动:
Mean Pass Rate for All Tests,,52,41,11,78.85%
直到“结果”下方。所以它看起来像这样:
Unit Tests
Model: A
Tue Sep 8 22:52:24 MDT 2020
User: br
Files Used:
DATA FILE - /path/to/file/data.txt
TEST TARBALL - /path/to/tarball/my_test.tar.bz2
Results:
Mean Pass Rate for All Tests,,52,41,11,78.85%
Module,Test Suite,Total Tests,Tests Passed,Tests Failed,Pass Rate
Individual Test Run,ClientTests,15,15,0,100.00%
,GraphTests,37,26,11,70.00%
不保证行号。 “使用的文件”部分可能包含更多文件。此外,根据正在运行的测试,可能还有其他“平均通过率”行。例如:
Unit Tests
Model: A
Tue Sep 8 22:52:24 MDT 2020
User: br
Files Used:
DATA FILE - /path/to/file/data.txt
TEST TARBALL - /path/to/tarball/my_test.tar.bz2
CLIENT FILE - /path/to/other/file/client.txt
Results:
Module,Test Suite,Total Tests,Tests Passed,Tests Failed,Pass Rate
Individual Test Run,ClientTests,15,15,0,100.00%
,ClientVarTests,12,12,0,100.00%
,GraphTests,37,26,11,70.00%
Mean Pass Rate for Client Tests,,27,27,0,100.00%
Mean Pass Rate for All Tests,,64,53,11,82.81%
在我的脚本中我尝试了 awk:
MEAN_PASS_ALL="Mean Pass Rate for All Tests"
awk '/${MEAN_PASS_ALL}/{t=$0;next}1;/RESULTS/{print t}' ${CSV_FILE}
然而,所做的只是打印出 .csv 文件的内容并且没有移动该行:
$ ./parse_results.sh
Unit Tests
Model: A
Tue Sep 8 22:52:24 MDT 2020
User: br
Files Used:
DATA FILE - /path/to/file/data.txt
TEST TARBALL - /path/to/tarball/my_test.tar.bz2
Results:
Module,Test Suite,Total Tests,Tests Passed,Tests Failed,Pass Rate
Individual Test Run,ClientTests,15,15,0,100.00%
,GraphTests,37,26,11,70.00%
Mean Pass Rate for All Tests,,52,41,11,78.85%
我也尝试了 sed,但出现了错误:
sed "/.*Mean/d;/.*RESULTS/i"$(sed -n '/.*Mean/p' ${CSV_FILE}) ${CSV_FILE}
$ ./parse_results.sh
sed: can't read Pass: No such file or directory
sed: can't read Rate: No such file or directory
sed: can't read for: No such file or directory
sed: can't read All: No such file or directory
sed: can't read Tests,,52,41,11,78.85%: No such file or directory
Unit Tests
Model: A
Tue Sep 8 22:52:24 MDT 2020
User: br
Files Used:
DATA FILE - /path/to/file/data.txt
TEST TARBALL - /path/to/tarball/my_test.tar.bz2
Results:
Module,Test Suite,Total Tests,Tests Passed,Tests Failed,Pass Rate
Individual Test Run,ClientTests,15,15,0,100.00%
,GraphTests,37,26,11,70.00%
看起来它删除了该行,但它没有将它打印到我想要的位置,也没有“保存”更改。
如果有多行包含“平均通过率”,我希望它们都移到“结果:”的正下方
我在这里做错了什么?如何移动文件中的行并将文件与更改一起保存?
谢谢!
【问题讨论】:
-
如果有多个
Mean Pass Rate行,那么您是否希望它们都移到Results:行下方? -
@anubhava - 是的。我需要把它们都搬上来。
-
perl -0777pe 's/(Results:\n)((?:.*\n)+?)((?:Mean Pass Rate.*\n)+)/\1\3\2/'