2014-04-18 21 views
1

我想只打印文件(超過100萬人,列)每隔一列中隔列所以首先我試圖使用數據的一個子集序列:使用了序列削減從一個大文件

cut -d ' ' -f 1,2,3,4,5,6,7,8,9,10,11,12 filename > filename.test 
    cut -d ' ' -f$(seq -s, 1 2 12) filename.test > filename.testout 

這是有效的 - 我最終的列數是第一個文件的一半。然而,當我試圖像這樣的完整數據集相同的方法:

cut -d ' ' -f$(seq -s, 1 2 1211418) file > fileout 

我得到這個錯誤:

-bash: /bin/cut: Argument list too long 

所以,我該怎麼辦,如果我從這個文件只需要每隔一列很多專欄?謝謝!

我引用using cut command to remove multiple columns但我卡在如何使我的巨大的文件工作...

回答

2

使用不同的工具。

perl -F'/\x20/' -ane 'print $F[0]; for ($i=2 ; $i<=$#F ; $i+=2) { print " $F[$i]" } print "\n"' 

-F告訴Perl在空間上分割(\ x20)。 -a告訴Perl分成@F數組。 -n告訴Perl在不打印每行的情況下逐行處理輸入。 -e介紹了表達式。 $#F是@F數組中最後一個元素的索引。

2

So what do I do if I need only every other column from a file with this many columns?

而不是嘗試使用需要你明確地傳遞命令行導致參數列表太長錯誤的領域的工具,使用的東西,不需要你這樣做。使用awk

awk '{for(i=1;i<=NF;i=i+2){printf "%s ", $i}{printf "%s", RS}}' filename 

或者,使用perl

perl -lane 'print join" ",@F[map {$_*2} 0..int($#F/2)]' inputfile 
1

你可以試試這個awk的解決方案:

awk 'BEGIN {FS=" " ; OFS=FS} 
    { for (i=1;i<=NF;i+=2) {printf("%s%s",$i,OFS)} 
     printf("\n","") 
    } INPUTFILE 
+1

一個錯字我想'的printf (「%s%s」,我,OFS)'不應該b e'printf(「%s%s」,$ i,OFS)'? – Ashkan

2

用awk

awk '{for(i=1;i<=NF;i+=2){if(i<NF-1){printf "%s ", $i} else{printf "%s", $i}}{print "";}}' input.txt