我想在文件中加入以下行。
输入
01EPH087362 SHHFHDH 3673
63737
Dhdhj
01EPH636363 DHHDH
3637737
Hshshhd
01EPH7373838 HDJJDJ
输出
01EPH087362 SHHFHDH 3673 63737 Dhdhj
01EPH636363 DHHDH 3637737Hshshhd
01EPH7373838 HDJJDJ
我想要输出如上;基本上每一行都应该以01EPH开头。
我有awk和sed但没有运气。如果你知道,请帮忙。
答案 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
,则打印已保存的信息(如果有),并清空已保存的信息和填充。
在每一行上,将填充和新行添加到保存的信息中;将垫设置为空白。
最后,如果有任何内容,请打印已保存的记录。
这甚至奇迹般地保留了DHHDH
和3637737Hshshhd
之间的双倍空格,因为在结束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