Unix如何根据模式连接行

时间:2017-01-06 15:49:04

标签: unix awk

我想在文件中加入以下行。

输入

01EPH087362 SHHFHDH 3673
63737
Dhdhj
01EPH636363 DHHDH 
3637737
Hshshhd
01EPH7373838 HDJJDJ

输出

01EPH087362 SHHFHDH 3673 63737 Dhdhj
01EPH636363 DHHDH  3637737Hshshhd
01EPH7373838 HDJJDJ

我想要输出如上;基本上每一行都应该以01EPH开头。

我有awk和sed但没有运气。如果你知道,请帮忙。

9 个答案:

答案 0 :(得分:2)

$ awk '/^01EPH/{if (NR>1) print buf; buf=$0; next} {buf = buf OFS $0} END{print buf}' file
01EPH087362 SHHFHDH 3673 63737 Dhdhj
01EPH636363 DHHDH  3637737 Hshshhd
01EPH7373838 HDJJDJ

答案 1 :(得分:1)

awk '/^01EPH/ { if (record != "") print record; record = ""; pad = "" }
     { record = record pad $0; pad = " " }
     END { if (record != "") print record }'

如果该行开始01EPH,则打印已保存的信息(如果有),并清空已保存的信息和填充。

在每一行上,将填充和新行添加到保存的信息中;将垫设置为空白。

最后,如果有任何内容,请打印已保存的记录。

这甚至奇迹般地保留了DHHDH3637737Hshshhd之间的双倍空格,因为在结束DHHDH的行上有一个尾随空白。

输出:

01EPH087362 SHHFHDH 3673 63737 Dhdhj
01EPH636363 DHHDH  3637737 Hshshhd
01EPH7373838 HDJJDJ

答案 2 :(得分:1)

<强>输入

$ cat f
01EPH087362 SHHFHDH 3673
63737
Dhdhj
01EPH636363 DHHDH 
3637737
Hshshhd
01EPH7373838 HDJJDJ

<强>输出

$ awk '(s=/^01EPH/) && NR>1{print ""}{printf("%s%s",(s?"":" "),$0)}END{print ""}' f
01EPH087362 SHHFHDH 3673 63737 Dhdhj
01EPH636363 DHHDH  3637737 Hshshhd
01EPH7373838 HDJJDJ

答案 3 :(得分:1)

我的看法:

awk '
    /^01EPH/ {printf "%s%s", nl, $0; nl = "\n"; next} 
    {printf " %s", $0} 
    END {print ""}
' file

答案 4 :(得分:1)

另一个awk

$ $ awk 'NR>1 && /^01EPH/ {print ""} 
                          {printf "%s", $0 OFS} 
         END              {print ""}' file

01EPH087362 SHHFHDH 3673 63737 Dhdhj
01EPH636363 DHHDH  3637737 Hshshhd
01EPH7373838 HDJJDJ

在模式匹配时添加换行符(第一行除外)和最后一行,否则追加行...

答案 5 :(得分:1)

当您的文件只有\ n行结尾时,您可以使用

sed 's/^01EPH/\r&/;$s/$/\r/' inputfile | tr -d "\n" | tr "\r" "\n"

sed的第一部分在每个\r之前插入01EPH。第二部分在末尾添加一个,以便最后一行也以换行结束。 现在删除原始换行符并用换行符替换标记的换行符 它会遍历该文件3次,因此任何awk解决方案对于大型文件都会更好,但我只想用tr显示sed

答案 6 :(得分:1)

@suyog:请你也可以试试,如果这对你有所帮助,请告诉我。

awk '{printf("%s%s",($0 ~ /^01E/ && NR>1)?ORS:NR>1?FS:"",$0)} END{print ""}' Input_file

输出如下。

01EPH087362 SHHFHDH 3673 63737 Dhdhj                                                                                                                                           
01EPH636363 DHHDH  3637737 Hshshhd                                                                                                                                             
01EPH7373838 HDJJDJ

答案 7 :(得分:0)

这是纯粹的Bash(加上printf)来做这个只是为了咯咯地笑:

while IFS= read -r line || [[ -n $line ]]; do 
    if [[ "$line" =~ ^01EPH ]]; then
        printf "%s%s" "$pad" "$line" 
        pad=$'\n'
    else
        printf " %s" "$line"
    fi
done <file  

这是一个Perl slurp解决方案:

perl -0777 -ne 'while (/(^01EPH.*?)(?=^01EPH|\z)/gms) {($st=$1)=~s/\n/ /g; print "$st\n" }' file

在这两种情况下,awk可能更好......

答案 8 :(得分:-1)

一个班轮:

tr '\n' ' ' < file.txt | sed s/01EPH/\\n01EPH/g

tr '\n' ' ' < file.txt - 制作一个字符串

sed s/01EPH/\\n01EPH/g - 新行前缀 01EPH