我需要将test.txt文件转换为列文件。
如果每个关键字后面的行数相同,但在本例中它们是不同的,我知道如何使用awk进行转换。
awk 'NR % 5 {printf "%s ", $0; next}1' test.txt 如果行数相同,这里是代码,但是这个代码不能处理这个输入文件。
要转换这个吗?请给我建议。
test.txt
"abc"
4
21
22
25
"standard"
1
"test"
4
5
10
11
12预期输出:
"abc" 4 21 22 25
"standard" 1
"test" 4 5 10 11 12发布于 2019-01-13 21:29:47
$ awk '{printf "%s%s", (/^"/ ? ors : OFS), $0; ors=ORS} END{print ""}' file
"abc" 4 21 22 25
"standard" 1
"test" 4 5 10 11 12发布于 2019-01-13 20:45:08
有点神奇,但在这种情况下有效:
sed -z 's/\n"/\n\x01"/g' |
tr '\n' ' ' |
tr $'\x01' '\n'" ... "之间的一个字符串。所以:sed,我在文件中的换行符和"之间放置了一些分隔符(我在十六进制中选择了0x01 )。请注意,-z是一个gnu扩展。0x01字节替换换行符。这个方法有点棘手,但是很简单,在标题以行开头的某个字符开始的情况下可以工作。
在图托利亚点上可以获得实时版本。
例如,可以使用不需要gnu扩展的sed来获得:
sed '2,$s/^"/\x01"/'即。对于大于第二行的行(如果该行以"开头),则在行的开头添加0x01字节。
发布于 2019-01-13 20:56:11
POSIX awk:
$ awk '/^"/{if (s) print s; s=$0; next} {s=s OFS $0} END{print s}' file
"abc" 4 21 22 25
"standard" 1
"test" 4 5 10 11 12 或使用perl
$ perl -0777 -lnE 'for (/^"[^"]+"\R(?:[\s\S]+?)(?=^"|\z)/mg) {tr /\n/ /; say} ' file如果字段中没有空格,则可以使用简单的tr和sed管道:
$ cat file | tr '\n' ' ' | sed -E 's/ ("[^"]*")/\
\1/g' 或GNU sed:
$ cat file | tr '\n' ' ' | sed -E 's/ ("[^"]*")/\n\1/g'https://stackoverflow.com/questions/54172947
复制相似问题