我能够从一个大的制表符分隔的文本文件中提取某些行并将它们写入另一个文件:
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
任何人都可以帮我解决这个问题吗?
答案 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