我有一个巨大的txt文件,其组织方式如下:
Test User</b></a> </td>
user@hotmail.com</a></td>
04-17-2012</span></td>
02-13-2013</span></td>
Another Test</b></a> </td>
fake@spam4.me</a></td>
11-06-2011</span></td>
11-09-2012</span></td>
Username123</b></a> </td>
email@test.com</a></td>
06-07-2011</span></td>
06-03-2013</span></td>
AdminTest</b></a> </td>
testing@gmail.com</a></td>
05-01-2012</span></td>
06-05-2014</span></td>
以下是我希望列表实际显示的方式:
Test User,user@hotmail.com,04-17-2012,02-13-2013
Another Test,fake@spam4.me,11-06-2011,11-09-2012
Username123,email@test.com,06-07-2011,06-03-2013
AdminTest,testing@gmail.com,05-01-2012,06-05-2014
有没有简单的方法可以通过命令行执行此操作,还是应该尝试使用其他路径?
答案 0 :(得分:0)
使用awk
即可:
awk -v OFS=, '{sub(/<.*$/, "")} NR%4==1{a=$1} NR%4==2{b=$1} NR%4==3{c=$1}
NR%4==0{print a, b, c, $1}' file
Test,user@hotmail.com,04-17-2012,02-13-2013
Another,fake@spam4.me,11-06-2011,11-09-2012
Username123,email@test.com,06-07-2011,06-03-2013
AdminTest,testing@gmail.com,05-01-2012,06-05-2014
sub
命令删除数据后的所有HTML标记modulo
数学,它从4个连续行中获取4个值NR%4==0
打印所有值时。答案 1 :(得分:0)
步骤1是删除XML-ish end-tag垃圾。那可能是:
sed 's/<.*//'
第2步是将相关行收集到一个。为此,我使用awk
。一个问题是有多少行构成一个条目。总是只有两个日期,还是可以有一个变数?新条目总是以大写字母开头,还是我们应该假设任何字母?用户名是否以数字开头?
假设带有大写字母的行开始一个新条目,那么这会在用户名行后面累积任意数量的电子邮件地址行和日期行:
awk '/^[A-Z]/ { if (line != "") print line; line = $0; next }
{ line = line "," $0 }
END { if (line != "") print line }'
虽然运行两个命令有点麻烦,但我们可以通过以下方式获取awk
来清理其输入:
awk ' { sub(/<.*/, "") }
/^[A-Z]/ { if (line != "") print line; line = $0; next }
{ line = line "," $0 }
END { if (line != "") print line }'
如果分隔输入行块的条件不同(键不是主要大写字母),则可以相应地更改代码。