Извините, я не дал всей необходимой информации в своем первоначальном вопросе. Все ответы были полезны для меня, чтобы прийти к тому, что я действительно хотел. В итоге я использовал следующее:
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
Так как cut
по умолчанию печатает строки без разделителей -, работает следующее
cut -f2 -d, file
awk -F, 'NF == 1 {print $1}
NF > 1 { print $2}' filename
Будет напечатана только первая строка, если запятая отсутствует, и вторая строка, если есть одна или несколько запятых.
awk -F, 'NF > 1 { $1 = $2 } { print $1 }' file
Это использует awk
для разбора файла как строк, состоящих из полей, разделенных запятыми -.
Код определяет, когда в строке имеется более одного поля, и когда это так, первое поле заменяется вторым полем. Затем печатается первое поле, либо неизмененное, либо модифицированное условным кодом.
Вы можете сделать это с помощью 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