Команда SED для получения значения, разделенного табуляцией между строками x и y - PullRequest
3 голосов
/ 27 ноября 2010

Мне удалось извлечь определенные строки из большого текстового файла, разделенного табуляцией, и записать их в другой файл:

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 ]

2 голосов
/ 27 ноября 2010

Однострочный 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
1 голос
/ 27 ноября 2010

Здесь используется 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

Я согласен с Альфом, что для этого лучше подойдет awk.

Вот решение awk с линейными ограничениями:

awk 'NR==100,NR==200{print $8}' file.tsv
1 голос
/ 27 ноября 2010

Я думаю, что лучше использовать awk таким образом:

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

Вперед работа будет легче, я думаю.

0 голосов
/ 27 ноября 2010

Это будет работать, если есть пустые поля.

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