2013-08-26 31 views
1

因此,我有一个txt文件,我需要提取每个第三个数字并使用终端将其打印到单独的文件中。 TXT文件只是数字的一个长长的清单,制表符分隔:从txt文件中提取每第n个数字

18 25 0 18 24 5 18 23 5 18 22 8.2 ... 

我知道有一种方法可以做到这一点使用awk或者sed,但到目前为止,我只能够通过提取每一第三行使用:

awk 'NR%3==1' testRain.txt > rainOnly.txt 

因此,这里的答案(或者更确切地说,答案我使用!):

xargs -n1 < input.txt | awk '!(NR%3)' > output.txt 

这会给你一个output.txt,每个原始文件的第三个数字作为一个单独的行。

+3

你想提取每三个*字符*,或每三个*号*? – user000001

+0

发布您的预期输出,以免我们猜测。 –

+0

对不起!每三个数字,所以输出将是0 5 5 8.2 – jwb4

回答

2

快速管道提取每3号:

$ xargs -n1 < file | sed '3~3!d' 
0 
5 
5 
8.2 

如果你不希望在一个新行每个号码通过xargs扔结果返回:

$ xargs -n1 < file | sed '3~3!d' | xargs 
0 5 5 8.2 

使用重定向至存储输出新文件:

$ xargs -n1 < file | sed '3~3!d' | xargs > new_file 

随着awk使用一个简单的for循环,你可以这样做:

$ awk '{for(i=3;i<=NF;i+=3)print $i}' file 
0 
5 
5 
8.2 

(增加一个尾部标签)

$ awk '{for(i=3;i<=NF;i+=3)printf "%s\t",$i;print ""}' file 
0 5 5 8.2 

或通过设置的RS值(增加尾随换行符)

$ awk '!(NR%3)' RS='\t' file 
0 
5 
5 
8.2 

$ awk '!(NR%3)' RS='\t' ORS='\t' file 
0 5 5 8.2 
+0

我喜欢这个单行xargs修复,但我得到这个错误: sed:1:“3〜3!d”:无效的命令代码〜 这是因为我使用OS X?我认为有一些sed技巧,你必须为Mac使用,但我似乎无法在网上找到答案... – jwb4

+0

我试过OS XI有同样的问题,所以使用'awk'!(NR%3 )''而不是'sed'3〜3!'。我不是'sed'专家,但@potong是我确信他可以建议*(虽然'awk'命令只是一个很好的短的在这里+便携式)* –

+0

FWIW我一直在使用sed 30+年,我无法告诉你'3〜3!d'应该做什么!我实际上会用答案底部的任一awk脚本。 –

1

您可以通过全局替换后面的两个字来打印每个第三个字符。当计数跨越一个换行符,使用Perl可能是最简单的办法:

perl -p000 -e 's/(.)../$1/gs' 

如果你想从每一行的第一,第四等字符,像sed面向行的工具就足够了:

sed 's/\(.\)../\1/g' 
+0

感谢您的支持。我想现在这是没有意义的,因为OP澄清说他写“人物”时他的意思是“数字”...... – tripleee

0

使用grep -P

grep -oP '([^\t]+\t){2}\K[^\t\n]+' file 
0 
5 
5 
8.2 
0

这可能为你工作(GNU SED):

sed -r 's/(\S+\s){3}/\1/g;s/\s$//' file 
0

@ user2718946 您的解决方案很近,但在这里您没有xarg。

awk 'NR%3==1' RS=" " file 
18 
18 
18 
18 

不同的开始:

awk 'NR%3==0' RS=" " file 
0 
5 
5 
8.2