繁体   English   中英

使用awk(或sed)根据下一行的第一个字符删除换行符

[英]Using awk (or sed) to remove newlines based on first character of next line

这是我的情况:我有一个大文本文件,我想从中提取某些信息。 我使用sed根据regexp提取所有相关信息,但我提取的每一条“信息”都在一个单独的行上,我希望每个“记录”都在它自己的行上,这样它就可以很容易地导入到一个DB。
这是我现在的数据样本:

92831,499,000
,0644321
79217,999,000
,5417178
,PK91622
,PK90755

理想情况下,我希望此输出看起来像:

92831,499,000,0644321
79217,999,000,5417178,PK91622
79217,999,000,5417178,PK90755

这可能更难做,所以我会满足于最后一个“记录”的输出只出现一次,附加的“PK ......”成为该行的第4个“字段”。
最后,我能想到的最简单的方法是,如果该行以逗号(^,)开头,那么新行应该删除之前......我不太熟悉awk但是如果你能给我一个从这开始它真的很感激! 谢谢!

$ perl -0pe 's/\n,/,/g' < test.dat
92831,499,000,0644321
79217,999,000,5417178,PK91622,PK90755

翻译:在没有行分隔的情况下批量阅读,只用逗号换掉换行后的每个逗号。

这里最短的代码!

嗯,我想我应该仔细看看在awk中使用Records时我昨晚想弄明白这一点......看了之后10分钟我就开始工作了。 对于任何对此感兴趣的人我是如何做到这一点的:在我原来的sed脚本中,我在每个记录的开头前面添加了一个额外的换行符,所以现在每个记录都有一个空行。 然后我使用以下awk命令:

awk'BEGIN {RS =“”; FS =“\\ n”}
{
if(NF> = 3)
for(i = 3; i <= NF; i ++)
打印$ 1,$ 2,$ i
}”

它就像一个魅力输出完全按照我想要的方式!

sedsed -d -n ':t;/^,/!x;H;n;/^,/{x;$!bt;x;H};x;s/\n//g;p;${x;/^,/!p}' filename

没有特殊的套管领域3,简单。

awk '
    !/^,/   { if (NR > 1) print x ; x = $0 }
    /^,/    { x = x OFS $0 }
    END     { if (NR) print x }
'

随着,更复杂但仍然不太难。

awk '
    !/^,/   { if (n && n < 3) print x ; x = $0 ; n = 1 }
    /^,/    { if (++n > 2) { print x, $0 } else { x = x OFS $0 } }
    END     { if (n && n < 3) print x }
'

这可能对你有用:

# sed ':a;N;s/\n,/,/;ta;P;D' test.dat | sed 's/,/\n/5;s/\(.*,\).*\n/&\1/'
92831,499,000,0644321
79217,999,000,5417178,PK91622
79217,999,000,5417178,PK90755

说明:

这分为两部分:

附加下一行,然后,如果附加的行以开头,删除嵌入的新行\\n再次启动。 如果没有打印到换行符然后删除到新行。 重复。

更换5 ,用一个新行。 然后在嵌入的换行符和第六个字段之间插入前四个字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM