如何对文件进行子集化 - 选择多个行或列

jia*_*mao 21 unix linux awk cut sed

我想就如何对大文件(数百万行或多行)进行子集化提供建议/帮助.

例如,

(1)我有大文件(数百万行,制表符分隔).我想要这个文件的一个子集,只有10000到100000的行.

(2)我有大文件(数百万列,制表符分隔).我想要这个文件的一个子集,只有10000到100000的列.

我知道有头,尾,切,分裂,awk或sed等工具.我可以用它们做简单的子集化.但是,我不知道该怎么做.

你能提出任何建议吗?提前致谢.

Dra*_*sha 28

过滤行很容易,例如使用AWK:

cat largefile | awk 'NR >= 10000  && NR <= 100000 { print }'
Run Code Online (Sandbox Code Playgroud)

使用CUT可以更轻松地过滤列:

cat largefile | cut -d '\t' -f 10000-100000
Run Code Online (Sandbox Code Playgroud)

正如Rahul Dravid所说,cat这不是必须的,正如Zsolt Botykai所说,你可以使用以下方法提高性能:

awk 'NR > 100000 { exit } NR >= 10000 && NR <= 100000' largefile
cut -d '\t' -f 10000-100000 largefile 
Run Code Online (Sandbox Code Playgroud)

  • 您可以将第一个缩短为:`awk'NR> = 10000 && NR <= 100000'largefile`,这是一个较少的过程,如果范围评估为true,则awk的默认操作是print.但是这样就没有任何东西在100000之后徘徊,所以最好把它写成:`awk'NR> 100000 {exit} NR> = 10000 && NR <= 100000'largefile`,这样处理将在第100001行停止. (6认同)
  • +1这是我能想到的最简单的答案.但是这里不需要猫.我们可以做到这一点没有猫.awk'NR> = 10000 && NR <= 100000 {print}'largefile`和`cut - d'\ t'-f 10000-100000 largefile` (5认同)
  • 由于您退出> 100000,因此无需检查NR <= 100000.`awk'NR> 100000 {exit} NR> = 10000'largefile` (2认同)

Vij*_*jay 17

一些不同的解决方

对于行范围:在sed:

sed -n 10000,100000p somefile.txt
Run Code Online (Sandbox Code Playgroud)

对于列范围awk:

awk -v f=10000 -v t=100000 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS) }' details.txt
Run Code Online (Sandbox Code Playgroud)