![](/img/trans.png)
[英]Using AWK or SED how can I remove any line where the first column's character count doesn't equal 13
[英]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.