(Unix)将一行更改为文本文件中的列

时间:2014-08-25 15:38:56

标签: linux bash unix awk sed

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

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做到这一点?

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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

答案 2 :(得分:3)

另一个人:

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的评论)

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

答案 3 :(得分:3)

$ awk -v RS=' ' '{ORS=(NR<2?" ":"\n")}1' file
TIME (HR)
0
6
12
18
24

答案 4 :(得分:0)

sed 's/ \([0-9]\)/\
\1/g' YourFile

posix版本(所以--posix用于GNU sed) 通过返回更改任何空格后跟数字。由于sed正则表达式中没有反向引用,因此数字会保留在内存中并进行回退