我有一个包含几千行的文本文件,如下所示:
文件:
abc: bla1 bla1 bla1...
cde: bla bla bla...
ghk: bla1 bla1 bla1...
lmn: bla bla bla...
abc: bla2 bla2 bla2...
bcd: bla bla bla...
ghk: bla2 bla2 bla2...
xyz: bla bla bla...
我想合并所有以相同项目开头的行(如1 and 5, 3 and 7
),以便我有一个像这样的新文本文件:
新文件:
abc: bla1 bla1 bla1... * abc: bla2 bla2 bla2...
cde: bla bla bla...
ghk: bla1 bla1 bla1... * ghk: bla2 bla2 bla2...
lmn: bla bla bla...
bcd: bla bla bla...
xyz: bla bla bla...
我想知道是否可以使用regex
和/或grep
来解决这个问题,如果是,那么我该如何解决呢?
我对grep
非常熟悉,因为我在使用TextWrangler,但也可以使用其他文本编辑器。
非常感谢。
答案 0 :(得分:3)
使用GNU bash。如果订单无关紧要。
declare -A A # declare associative array A
# fill array
while read I L; do
[ ${#A[$I]} -gt 0 ] && A[$I]+=" * $L"
[ ${#A[$I]} -eq 0 ] && A[$I]+=" $L"
done < filename
# print array
for J in "${!A[@]}"; do echo "$J${A[$J]}"; done
输出:
xyz: bla bla bla...
lmn: bla bla bla...
abc: bla1 bla1 bla1... * bla2 bla2 bla2...
ghk: bla1 bla1 bla1... * bla2 bla2 bla2...
bcd: bla bla bla...
cde: bla bla bla...
答案 1 :(得分:2)
如果订单无关紧要,我建议先对文本进行排序。这将是
abc: ...
abc: ...
彼此相邻。然后,您将通过几次通过this regex:
Search:
^(\w+): (.*)\n\1:
Replace:
\1: \2
Result:
abc: bla1 bla1 bla1... bla2 bla2 bla2...
bcd: bla bla bla...
cde: bla bla bla...
ghk: bla1 bla1 bla1... bla2 bla2 bla2...
lmn: bla bla bla...
xyz: bla bla bla...
如果订单很重要,那么this regex可以运行几次:
Search:
^(\w+): (.*)\n((?:(?!\1).*\n)+)\1: (.*\n)
Replace:
\1: \2 \4\3
Result (1st pass):
abc: bla1 bla1 bla1... bla2 bla2 bla2...
cde: bla bla bla...
ghk: bla1 bla1 bla1...
lmn: bla bla bla...
bcd: bla bla bla...
ghk: bla2 bla2 bla2...
xyz: bla bla bla...
Result (2nd pass):
abc: bla1 bla1 bla1... bla2 bla2 bla2...
cde: bla bla bla...
ghk: bla1 bla1 bla1... bla2 bla2 bla2...
lmn: bla bla bla...
bcd: bla bla bla...
xyz: bla bla bla...
答案 2 :(得分:0)
如果你可以使用awk
,这应该可行:
awk '{a[$1]=a[$1]?a[$1]"* "$0:$0} END {for (i in a) print a[i]}' file
ghk: bla1 bla1 bla1... * ghk: bla2 bla2 bla2...
lmn: bla bla bla...
cde: bla bla bla...
xyz: bla bla bla...
bcd: bla bla bla...
abc: bla1 bla1 bla1... * abc: bla2 bla2 bla2..