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

3

我已经可以从一个大型的制表符分隔文本文件中提取出某些行,并将它们写入另一个文件:

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

然而,我的实际目的是从每行中获取第8个tab分隔值并将它们写入一个逗号分隔的文件,但是我无法找到正确的语法来进行模式匹配,尽管已经阅读了数十篇在线文章。
对于每一次,我基本上都在尝试匹配

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

中的$2,但是没有成功。

文本文件file.tsv中的行类似于:
01  name1   title1  summary1    desc1   image1  url1    120019  time1
02  name2   title2  summary2    desc2   image2  url2    576689  time2

请问有人能帮我解决这个查询吗?


你能提供一行示例代码吗? - Brian Clements
我已经添加了上面的格式,并尝试使用诸如以下命令: sed -e '100,/start/ s/[^\t]\t[^\t]\t[^\t]\t[^\t]\t[\t^]\t[^\t]\t[^\t]\t//' -e '/stop/,200 s/\t.*//' file.tsv,但效果不佳。 - Donna
4个回答

2

一个Perl的一行命令:

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

你好,感谢您的快速回复!看起来很理想。唯一的问题是数据是用制表符分隔而不是逗号分隔,导致无法匹配正确的列。请问我该如何进行更改呢? - Donna
唐:嗨。不用谢。我已经编辑了我的答案,添加了一个明确的\t作为字段分隔符。现在应该可以工作了。 - Alan Haggai Alavi

2

我认为我更愿意那样使用awk:

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

我猜前面的工作会更容易。


谢谢您的回复,不幸的是,我不熟悉如何在制表符文件中使用那种语法。 - Donna

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

如果您需要保留除制表符以外的空格,请在POSIX版本中将所有[:space:]替换为\t - Brian Clements
那很理想。谢谢你提供的解决方案。你完美地解决了我的问题,我也可以从中看到如何进行修改。非常感谢你的帮助。 - Donna

0

如果有空字段,这将起作用。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接