1

所以我有一个 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将原始文件的第三个数字作为单独的行。

4

5 回答 5

2

提取每第三个数字的快速管道:

$ 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
于 2013-08-26T17:46:56.673 回答
1

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

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

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

sed 's/\(.\)../\1/g'
于 2013-08-26T17:52:41.577 回答
0

使用grep -P

grep -oP '([^\t]+\t){2}\K[^\t\n]+' file
0
5
5
8.2
于 2013-08-26T17:57:40.173 回答
0

这可能对您有用(GNU sed):

sed -r 's/(\S+\s){3}/\1/g;s/\s$//' file
于 2013-08-26T18:53:45.563 回答
0

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

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

不同的开始:

awk 'NR%3==0' RS=" " file
0
5
5
8.2
于 2013-08-27T07:00:49.880 回答