найти номер поля - PullRequest
       16

найти номер поля

4 голосов
/ 24 мая 2011

У меня есть эта строка в файле:

,2,353867835022;11,353681041426390,272023201187741,272-02f-20017-06609,353854100352;11,,,,,,,0854100352,3,00,,O,D,DATA,,,7124395,,,17687,16,HPLMN,M20MSS_TTFILE_8377_20110528170245,M20MSS,W30B22I;0GRI3,1,20110528130013,170054,1,41,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001820,,,,b60a5c0014,1:353867835022::::0854100352::353854100352,,,,,,,,

Да, это запятая "," разделенный файл. есть число 17687. Я хочу знать, каков номер этого поля в строке. я хочу использовать это в качестве основы и включить в сценарий оболочки.

Ответы [ 6 ]

3 голосов
/ 24 мая 2011

Итак, вы хотите количество запятых до 17687?Один из способов сделать это:

sed -r 's/(^.*,)17687,.*$/\1/;s/[^,]//g'|wc -c

Это захватывает все до 17687, удаляет все запятые и подсчитывает количество символов.

Используя это в скрипте, выможет сделать что-то вроде:

FIELD_NO=`sed -r 's/(^.*,)17687,.*$/\1/;s/[^,]//g'|wc -c`
cut -d',' -f$FIELD_NO some_file
3 голосов
/ 24 мая 2011

Поле № 26:

% awk -F',' '/17687/ {
    for (f = 0; f < NF; ++f) {
        if ($f == "17687") {
            print $f " found in field number " f " of " NF " on line " NR "."
        }
    }
}' test.csv
17687 found in field number 26 of 75 on line 1.

Это позволяет найти 17687 в нескольких полях на нескольких строках.

Надеюсь, это поможет.

1 голос
/ 25 мая 2011

Awk oneliner, один процесс:

awk -F, '/17687/{n=NF;sub(".*,17687,","");print n-NF}' file

Для больших файлов используйте молниеносный mawk, если он доступен на вашей платформе.

1 голос
/ 24 мая 2011

Небольшое улучшение по сравнению с версией Дэвида , использующей только одно регулярное выражение.

sed -r "s/17687,.*|[^,]*//g"  | wc -c
1 голос
/ 24 мая 2011

Perl

FLD="17687"
perl -F/,/ -slane '%h=map{$_,++$i}@F ;print $h{$fld}||0' -- -fld="$FLD"

для вашего примера строки выведите 26 (считая от 1) или "0", если не найдены Будет искать последний индекс строки.

или

perl -F/,/ -slane 'map{print}grep { $F[$_] eq $fld } 0..$#F;' -- -fld="$FLD"

напечатает все индексы (считая от 0) или ничего ...

1 голос
/ 24 мая 2011

Вы также можете использовать tr, чтобы изменить разделитель полей на новую строку, grep - найти строку и cat, если хотите. Например:

$ cat t.csv|tr ',' '\n'|cat -n|grep  17687
    26  17687

или лучше

$ cat t.csv|tr ',' '\n'|grep  -n 17687
26:17687

Или даже

$ tr ',' '\n' < t.csv |grep  -n 17687
26:17687
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...