【发布时间】:2019-03-03 20:03:38
【问题描述】:
我有这样的文字:
37 7 -------------- No aaa
40 0 -------------- No bbb
xxx zzy
aa bb cc
42 2 -------------- No ccc
xxx zyz
a b c d
43 3 -------------- No ddd
xy zz
a a
a a
c
52 5 -------------- No eee
yyyx zzz
当我用 awk 处理它时,我得到:
awk '{if($1+0==$1) p=$1 FS $2 FS $3 FS $4 FS $5; else $0=p FS $0}1' /tmp/test3 | column -t
37 7 -------------- No aaa
37 7 -------------- No aaa xxx zzz
40 0 -------------- No bbb
40 0 -------------- No bbb xxx zzy
40 0 -------------- No bbb aa bb cc
42 2 -------------- No ccc
42 2 -------------- No ccc xxx zyz
42 2 -------------- No ccc a b c d
43 3 -------------- No ddd
43 3 -------------- No ddd xy zz
43 3 -------------- No ddd a a
43 3 -------------- No ddd a a
43 3 -------------- No ddd c
52 5 -------------- No eee
52 5 -------------- No eee yyyx zzz
我需要得到以下输出:
37 7 -------------- No aaa
40 0 -------------- No bbb xxx zzy
40 0 -------------- No bbb aa bb cc
42 2 -------------- No ccc xxx zyz
42 2 -------------- No ccc a b c d
43 3 -------------- No ddd xy zz
43 3 -------------- No ddd a a
43 3 -------------- No ddd a a
43 3 -------------- No ddd c
52 5 -------------- No eee yyyx zzz
提前感谢您的帮助!我也试过
awk '/-/{base=$0; next} {print base, $0}' /tmp/test4 | column -t 如建议的那样,但如果有以数字开头的连续行,它将删除以数字开头的第一行。
更新
这个 sed 咒语解决了我的问题: sed -r ':a;N;/^[0-9].\n[0-9]/{P;D};:b;s/^(.)\n( .)/\1 \2\n\1/;P;s/.\n//;$d;N;/\n[0-9]/D;bb' /tmp /test2
还有一个问题:如果我在输出行中有超过 8 列,有没有办法修改 sed 命令,以便将第 9、10 和 11 列移动到新行并复制它之前的前 5 列?
假设我有这 3 行:
42 2 -------------- 无 ccc xxx zyz 42 2 -------------- 无 ccc a b c d e f 43 3 -------------- 无 ddd xy zz我想得到:
42 2 -------------- 无 ccc xxx zyz 42 2 -------------- 无 ccc a b c 42 2 -------------- 无 ccc d e f 43 3 -------------- 无 ddd xy zz【问题讨论】:
-
这个略有不同,我被要求发布另一个问题。
-
@zdim,我的错,我刚刚修好了...
-
@Slaw 很好,感谢您的响应。我更新了我的答案。我建议在发布问题时要格外小心。它有助于很多获得好的答案,而且对每个人都更好:)
标签: perl awk sed text-processing