这是我的情况:我有一个大文本文件,我想从中提取某些信息。我使用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但是如果你能给我一个从这开始它真的很感激!谢谢!
答案 0 :(得分:6)
$ perl -0pe 's/\n,/,/g' < test.dat 92831,499,000,0644321 79217,999,000,5417178,PK91622,PK90755
翻译:在没有行分隔的情况下批量阅读,只用逗号替换换行符后面的每个逗号。
此处最短的代码!
答案 1 :(得分:2)
好吧,我想我应该仔细看看在awk中使用Records时我昨晚想弄明白这一点......看了之后10分钟我就开始工作了。对于任何有兴趣的人,我是如何做到这一点的: 在我原来的sed脚本中,我在每个记录的开头前面添加了一个额外的换行符,所以现在每个记录都有一个空行。然后我使用以下awk命令:
awk'BEGIN {RS =“”; FS =“\ n”}
{
if(NF> = 3)
for(i = 3; i <= NF; i ++)
打印$ 1,$ 2,$ i
}“
它就像一个以我想要的方式输出的魅力!
答案 2 :(得分:1)
sedsed -d -n ':t;/^,/!x;H;n;/^,/{x;$!bt;x;H};x;s/\n//g;p;${x;/^,/!p}' filename
答案 3 :(得分:1)
没有特殊套管领域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 }
'
答案 4 :(得分:1)
这可能对您有用:
# 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个,
。然后在嵌入的换行符和第六个字段之间插入前四个字段。