【问题标题】:(Unix) Changing A Row To A Column In A Text File(Unix) 将文本文件中的行更改为列
【发布时间】:2014-08-25 15:38:55
【问题描述】:

我目前有一个文本文件,其中包含以下行格式数据:

TIME (HR) 0 6 12 18 24 36 48 60 72 84 96 108 120

我想把这一行“翻转”成一列,这样它就变成了:

TIME (HR)
0
6
12
18
24
etc...

有没有办法用 sed/awk 做到这一点?

【问题讨论】:

  • 有可能。不过,首先,最好知道何时应该包含新行。你想到了什么模式?另外,到目前为止,您尝试了什么?

标签: linux bash unix awk sed


【解决方案1】:

grep 可以做到:

grep -Po '.*\)|\d+' file

这条线也可以:

grep -Po '.*?(?= \d)|\d+' file

测试:

kent$  cat f
TIME (HR) 0 6 12 18 24 36 48 60 72 84 96 108 120

kent$  grep -Po '.*\)|\d+' f
TIME (HR)
0
6
12
18
24
36
48
60
72
84
96
108
120

【讨论】:

  • 这不会在TIME 之后插入换行符吗?
  • @anubhava 改成 grep 行,把 TIME 和 () 放在一起。
  • 我觉得如果你的代码是grep -Po '.*\)|\S+' file会更好
【解决方案2】:
$ awk -v RS=' ' '{ORS=(NR<2?" ":"\n")}1' file
TIME (HR)
0
6
12
18
24

【讨论】:

  • 它在最后添加了一个额外的空间。
  • 是的。这是 OP 请求的etc... 预期输出的一部分:-)。只需将 RS 更改为 RS='[[:space:]]+' 即可解决该问题,如果 OP 关心并且正在使用 GNU awk 进行多字符 RS。
【解决方案3】:

通过 awk,

awk '{print $1,$2;for(i=3;i<=NF;i++) print $i}' file

通过 perl,

perl -pe 's/(^\S+\s+\S+)(*SKIP)(*F)| /\n/g' file

【讨论】:

  • 你只是从 &lt;&lt;= 的一个小改动,+1 以获得好的答案。
【解决方案4】:

另一个perl:

perl -pe 's/\s+(?=\d+)/\n/g'

测试:

$ echo 'TIME (HR) 0 6 12 18 24 36 48 60 72 84 96 108 120' | perl -pe 's/ (?=\d+)/\n/g'
TIME (HR)
0
6
12
18
24
36
48
60
72
84
96
108
120

另一个很棒的解决方案(来自@AvinashRaj 的 cmets)

perl -pe 's/\s+(?!\()/\n/g'
perl -pe 's/ (?=\b)/\n/g'

【讨论】:

  • 如果输入包含数字以外的非空格字符,它将不起作用。
  • op's 已经明确提到他在非空格字符之间有一个空格.. :-)
  • 另一个更好的给你perl -pe 's/ (?=\b)/\n/g' file :-)
【解决方案5】:
sed 's/ \([0-9]\)/\
\1/g' YourFile

posix 版本(所以 --posix 用于 GNU sed) 更改任何空格,后跟一个数字,然后返回。数字保留在内存中并由于 sed 正则表达式中没有反向引用而被设置回来

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多