我有一个由某些商业软件生成的文本文件,如下所示。它由括号分隔的部分组成,每个部分都有数百万个元素,但具体值因情况而异。
(1
2
3
...
)
(11
22
33
...
)
(111
222
333
...
)
我需要实现如下输出:
1; 11; 111
2; 22; 222
3; 33; 333
... ... ...
我发现了一个复杂的方法:
-
执行 sed 操作得到
1
2
3
...
#
11
22
33
...
#
111
222
333
...
-
使用 awk 如下将我的文件分成几个子文件
awk -v RS="#" '{print > ("splitted-" NR ".txt")}'
-
使用 sed 再次从我的子文件中删除空格
sed -i '/^[[:space:]]*$/d' splitted*.txt
-
将所有内容连接在一起:
paste splitted*.txt > out.txt
-
添加字段分隔符(在我的 bash 脚本中定义)
awk -v sep=$my_sep 'BEGIN{OFS=sep}{$1=$1; print }' out.txt > formatted.txt
当我多次循环超过百万行时,我觉得这很糟糕。
即使返回时间相当不错(~80秒),我也想找到一个完整的 awk 解决方案,但无法找到它。
就像是:
awk 'BEGIN{RS="(\\n)"; OFS=";"} { print something } '
我发现了一些相关的问题,尤其是这个使用 awk 进行行到列转换 https://stackoverflow.com/questions/19752644/row-to-column-and-column-to-row-using-awk,但它假设括号之间的行数恒定,这是我做不到的。
任何帮助,将不胜感激。
使用 GNU awk 实现多字符 RS 和真正的多维数组:
$ cat tst.awk
BEGIN {
RS = "(\\s*[()]\\s*)+"
OFS = ";"
}
NR>1 {
cell[NR][1]
split($0,cell[NR])
}
END {
for (rowNr=1; rowNr<=NF; rowNr++) {
for (colNr=2; colNr<=NR; colNr++) {
printf "%6s%s", cell[colNr][rowNr], (colNr<NR ? OFS : ORS)
}
}
}
$ awk -f tst.awk file
1; 11; 111
2; 22; 222
3; 33; 333
...; ...; ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)