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