SED命令在第x行和第y行之间获取第n个制表符分隔值

时间:2010-11-27 17:29:15

标签: linux sed pattern-matching

我能够从一个大的制表符分隔的文本文件中提取某些行并将它们写入另一个文件:

sed -n 100,200p file.tsv >> output.txt

但是,我实际上是试图从每一行中获取第8个制表符分隔值并将它们写入以逗号分隔的文件,但我找不到用于模式匹配的正确语法,尽管阅读了数十篇在线文章。

每次我基本上都试图匹配

$2

中的

/([^\t]*\t){7}([0-9]*).*/

没有运气。

文本文件file.tsv中的行类似于:

01  name1   title1  summary1    desc1   image1  url1    120019  time1
02  name2   title2  summary2    desc2   image2  url2    576689  time2

任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

Perl one-liner:

perl -F'\t' -ane 'push @csv, $F[7] if $. > 100 && $. < 200; END { print join ",", @csv if @csv }' /path/to/input/file > /path/to/output/file

答案 1 :(得分:1)

我想我宁愿那样使用awk:

$ awk '{ print col 8 : $8 }' file

我猜你的前瞻性工作会更容易。

答案 2 :(得分:1)

这里使用的是GNU sed和扩展表达式:

sed -nre '100,200{s/^(\S+\s+){7}(\S+).*$/\2/;p}' file.tsv

这里只使用POSIX:

sed -n '100,200{s/^\([^[:space:]]\+[[:space:]]\+\)\{7\}\([^[:space:]]\+\).*$/\2/;p}' file.tsv

我同意Alf的观点,awk更适合这种情况。

以下是包含行限制的awk解决方案:

awk 'NR==100,NR==200{print $8}' file.tsv

答案 3 :(得分:0)

如果有空字段,这将有效。

sed -nre '100,200{s/^(([^\t]*)\t){7}([^\t]*)(\t.*|$)/\3/;p}' file.tsv