31

我有一个非常大的文件,我需要在其中获取每 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;}
     }
4

5 回答 5

62

每隔一行打印一次,从第一行开始:

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

从第 10 行开始,每隔 10 行打印一次:

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
于 2012-04-01T22:34:01.623 回答
17

使用,您可以使用该命令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
于 2012-04-01T23:30:37.090 回答
9

小菜一碟:cat test.txt | awk 'NR % 10 == 1'

于 2012-04-01T22:36:40.373 回答
2

这不是(g)awk,但它会起作用:

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

于 2012-04-01T22:31:44.603 回答
2

直接在命令提示符 (Windows) 中执行此操作。

将gawk.exe文件放到文件所在的文件夹中,在文件夹中启动命令Prompt,写入

gawk "NR%n==x" oldfile.txt>newfile.txt

n 是您要打印的每第 n 行,x 是起始行。

例如 n=10 和 x=1,打印第 1,11,21,31,41 行......从原始文件到新文件的结束行。

例如 n=20 和 x=5,打印第 5,25,45,65 行......从原始文件到新文件的结束行。

于 2019-02-22T12:16:12.747 回答