2011-11-28 79 views
1

使用Windows 7 & gawk 3.1.3(通过UnxUtils)。使用awk将多行文件转换为TSV

我希望把这个输入(利物浦的夹具):

Sunday, 27 November 2011 
Barclays Premier League 
Liverpool v Man City, 16:00 
Tuesday, 29 November 2011 
Carling Cup 
Chelsea v Liverpool, QF, 19:45 
... 

到制表符分隔的文件,如:

Sunday, 27 November 2011<tab>Barclays Premier League<tab>Liverpool v Man City, 16:00 
Tuesday, 29 November 2011<tab>Carling Cup<tab>Chelsea v Liverpool, QF, 19:45 
... 

我试着使用awk这样做,但迄今为止失败。识别每一个第一和第二行是很容易的:

if (NR % 3 == 1 || NR % 3 == 2) print; 

但尽管多次试图(通常会导致语法错误)无法找出如何剥离出(视窗)行结束并连接那些每三线。

我现在想知道awk实际上是否是正确的工具。

感谢您的指点。

回答

2
awk '(NR % 3) > 0 {printf("%s\t",$0)} 
    (Nr % 3) == 0 {printf("%s\n",$0)} 

应该工作。对于模数为NR(记录数)不为0的每一行,它将打印该行和一个tab字符。否则(输入)行和换行符。

HTH

+0

完美,谢谢!我正在搞sub()并且无处可去。 –

2

看到下面的测试:

kent$ echo "Sunday, 27 November 2011 
Barclays Premier League 
Liverpool v Man City, 16:00 
Tuesday, 29 November 2011 
Carling Cup 
Chelsea v Liverpool, QF, 19:45 
"|awk '{printf $0"\t";if(!(NR%3))print""}' 

输出:

Sunday, 27 November 2011  Barclays Premier League Liverpool v Man City, 16:00 
Tuesday, 29 November 2011  Carling Cup  Chelsea v Liverpool, QF, 19:45 
+0

(在我的Windows 7 PC)这是离开在每行的末尾一个额外的标签,但它会做的工作一样好。也谢谢你。 –