извлечь символы между двумя запятыми?

Извините, я не дал всей необходимой информации в своем первоначальном вопросе. Все ответы были полезны для меня, чтобы прийти к тому, что я действительно хотел. В итоге я использовал следующее:

sort -t- -k1,1 -k2,2

где:

-t-       divide the hostnames into fields using dash (-) rather than spaces
-k1,1     the first sort key is the first field (from 1 to 1), a normal sort
-k2,2     the second key is the second field using a numeric (n) sort
          (the field includes the ".example.org" but the numeric sort
          seems to cope find with the trailing non-number chars)

это дает результат:

blargh-1.example.org
    :
blargh-13.example.org
thingaroo-1.example.org
    :
thingaroo-17.example.org
whatever-1.example.org
    :
whatever-13.example.org
4
08.04.2019, 20:48
4 ответа

Так как cutпо умолчанию печатает строки без разделителей -, работает следующее

cut -f2 -d, file
18
27.01.2020, 20:44
awk -F, 'NF == 1 {print $1}
         NF > 1 { print $2}' filename

Будет напечатана только первая строка, если запятая отсутствует, и вторая строка, если есть одна или несколько запятых.

1
27.01.2020, 20:44
awk -F, 'NF > 1 { $1 = $2 } { print $1 }' file

Это использует awkдля разбора файла как строк, состоящих из полей, разделенных запятыми -.

Код определяет, когда в строке имеется более одного поля, и когда это так, первое поле заменяется вторым полем. Затем печатается первое поле, либо неизмененное, либо модифицированное условным кодом.

3
27.01.2020, 20:44

Вы можете сделать это с помощью Perlследующим образом.

Команда -строка:

$ perl -F, -pale '$_ = $F[1] // $_' out.txt

Пояснение:

  • -pбудет читать строки записей -по строке -И автоматически печатать перед тем, как перейти к чтению следующего или eof.
  • -lделаетIRS = ORS = "\n"
  • -F,делает FSзапятой.
  • -aразбивает каждую запись $_по разделителю полей, в нашем случае запятой, и продолжает и сохраняет сгенерированные таким образом поля в массиве @F, который имеет нулевой -индекс.
  • -eподразумевает, что за ним следует код Perl, который должен применяться к каждой записи.
  • Выражение
  • $_ = $F[1] // $_читается следующим образом :если второе поле $F[1]не определено, используйте текущую запись $_. А затем результат этого выражения присваивается текущей записи $_.
  • из-за того, что используется переключатель -pв perl, перед считыванием новой записи текущая запись берется в stdout.

Результат:

NA
NA
NA
NA
NA
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85752
gene85752

Вы также можете сделать это с помощью версии GNU редактора sed, как показано ниже:

$ sed -ne '
    s/,/\n/
    s/.*\n//
    s/,/\n/
    P
' out.txt
0
27.01.2020, 20:44

Теги

Похожие вопросы