从txt文件中提取每个第n个数字

时间:2013-08-26 17:43:55

标签: sed awk terminal

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

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

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

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

所以这就是答案 (或者更确切地说,我使用的答案!):

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

这会为您提供一个output.txt,它将原始文件的每三个数字作为一个单独的行。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以通过全局替换下一个没有任何内容来打印每个第三个字符。当计数跨越换行符时,使用Perl可能是最简单的解决方案:

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

如果你想要每一行的第一个,第四个等字符,那么像sed这样的面向行的工具就足够了:

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

答案 2 :(得分:0)

使用grep -P

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

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

答案 4 :(得分:0)

@ user2718946 你的解决方案很接近,但是你没有xarg。

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

不同的开始:

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