首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将txt转换为列文件

将txt转换为列文件
EN

Stack Overflow用户
提问于 2019-01-13 20:31:15
回答 5查看 112关注 0票数 0

我需要将test.txt文件转换为列文件。

如果每个关键字后面的行数相同,但在本例中它们是不同的,我知道如何使用awk进行转换。

代码语言:javascript
运行
复制
awk 'NR % 5 {printf "%s ", $0; next}1' test.txt 

如果行数相同,这里是代码,但是这个代码不能处理这个输入文件。

要转换这个吗?请给我建议。

test.txt

代码语言:javascript
运行
复制
"abc"
4
21
22
25
"standard"
1
"test"
4
5
10
11
12

预期输出:

代码语言:javascript
运行
复制
"abc" 4 21 22 25
"standard" 1 
"test" 4 5 10 11 12
EN

回答 5

Stack Overflow用户

发布于 2019-01-13 21:29:47

代码语言:javascript
运行
复制
$ 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
票数 2
EN

Stack Overflow用户

发布于 2019-01-13 20:45:08

有点神奇,但在这种情况下有效:

代码语言:javascript
运行
复制
sed -z 's/\n"/\n\x01"/g' |
tr '\n' ' ' |
tr $'\x01' '\n'
  1. 每个“头”都是" ... "之间的一个字符串。所以:
  2. 使用sed,我在文件中的换行符和"之间放置了一些分隔符(我在十六进制中选择了0x01 )。请注意,-z是一个gnu扩展。
  3. 然后我用所有的换行符来代替一个空格。
  4. 然后用所有0x01字节替换换行符。

这个方法有点棘手,但是很简单,在标题以行开头的某个字符开始的情况下可以工作。

图托利亚点上可以获得实时版本。

例如,可以使用不需要gnu扩展的sed来获得:

代码语言:javascript
运行
复制
sed '2,$s/^"/\x01"/'

即。对于大于第二行的行(如果该行以"开头),则在行的开头添加0x01字节。

票数 0
EN

Stack Overflow用户

发布于 2019-01-13 20:56:11

POSIX awk:

代码语言:javascript
运行
复制
$ 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

代码语言:javascript
运行
复制
$ perl -0777 -lnE 'for (/^"[^"]+"\R(?:[\s\S]+?)(?=^"|\z)/mg) {tr /\n/ /; say} ' file

如果字段中没有空格,则可以使用简单的trsed管道:

代码语言:javascript
运行
复制
$ cat file | tr '\n' ' ' | sed -E 's/ ("[^"]*")/\
\1/g' 

或GNU sed:

代码语言:javascript
运行
复制
$ cat file | tr '\n' ' ' | sed -E 's/ ("[^"]*")/\n\1/g'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54172947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档