2012-04-01 59 views
11

我有一个非常大的文件,我需要获取每行第n行并将其打印成一行。使用gawk将每第n行打印成一行

我的数据:

1  937 4.320194 
2  667 4.913314 
3  934 1.783326 
4  940 -0.299312 
5  939 2.309559 
6  936 3.229496 
7  611 -1.41808 
8  608 -1.154019 
9  606 2.159683 
10  549 0.767828 

我希望我的数据是这样的:

1  937 4.320194 
3  934 1.783326 
5  939 2.309559 
7  611 -1.41808 
9  606 2.159683 

当然,这是一个例子,我想为我的庞大的数据文件每10行。我想这至今:

NF == 6 { 
    if(NR%10) {print;} 
    } 

回答

33

要打印每一第二行,始于第一:

awk 'NR%2==1' file.txt 

要打印每十行,从第十行:

awk 'NR%10==0' file.txt 

要在脚本中使用此,将以下内容添加到名为script.awk的文件中:

BEGIN { 
    print "Processing file" 
} 

NR%10==0 

END { 
    print "Finished processing" 
} 

然后执行:蛋糕

awk -f script.awk file.txt 
+0

不应该是'awk'NR%10 == 0'file.txt'? – 2012-04-01 22:37:32

+0

@ D.Shawley是的,你是对的。我应该在回答之前真正阅读所有内容!干杯! – Steve 2012-04-01 22:46:14

+0

非常感谢,我知道这是一个简单的问题,但我无法想象出我的生活。 – user1269741 2012-04-01 22:52:49

2

这不是(G)的awk,但它会工作:

cat myfile | grep ^[[:digit:]]*0[[:blank:]]应该做的伎俩。

9

海贼王:cat test.txt | awk 'NR % 10 == 1'

+1

+1。 :) – sarnold 2012-04-01 22:37:09

+0

打印每10行之后的行 - 第1行,第11行,第21行,第31行等。您希望模数为零而不是1的行。 – 2012-04-02 09:09:05

+2

那么,为什么?这也会打印每第10行,从第一行开始,并与作为示例给出的内容相匹配。 – 2012-04-02 11:42:11

10

随着sed,你可以做很多的变化对这个很容易与first~step命令。例如:

# Odd lines 
sed -n 1~2p file 
# Every tenth line (10, 20, 30, ...) 
sed -n 10~10p file 
# Every tenth line (1, 11, 21, ...) 
sed -n 1~10p file 
# First plus every tenth (1, 10, 20, 30, ...) 
sed -n -e 1p -e 10~10p file 
+0

在这里使用'sed'很好用+1! – Steve 2012-04-02 00:20:54

+0

在Mac OS X上我得到'无效的命令代码〜'。任何想法为什么? – Gerard 2013-10-17 11:33:56

+1

@Gerard See:https://stackoverflow.com/questions/30003570/how-to-use-gnu-sed-on-mac-os-x – arielf 2016-01-14 00:58:20