Как добавить строку в столбец n и первую строку файла?

Мы наконец воспроизвели эту проблему, постоянно касаясь экрана двумя руками.

debian @ beaglebone: ~ $ xinput --list \ u23a1 Идентификатор указателя виртуального ядра = 2 [главный указатель (3)] \ u239c \ u21b3 Идентификатор указателя XTEST виртуального ядра = 4 [ подчиненный указатель (2)] \ u239c \ u21b3 HID 1241: 1177 id = 8 [подчиненный указатель (2)] \ u239c \ u21b3 ti-tsc id = 7 [подчиненный указатель (2) ] \ u23a3 Идентификатор клавиатуры виртуального ядра = 3 [основная клавиатура (2)] \ u21b3 Идентификатор клавиатуры виртуального ядра XTEST = 5 [подчиненная клавиатура (3)] \ u21b3 tps65217_pwr_but id = 6 [подчиненная клавиатура (3)] \ u21b3 gpio_keys.13 id = 10 [подчиненная клавиатура (3)]

примечание: HID 1241: 1177 - подключенная мышь

ti-tsc - touschcreen (я думаю)

Когда я запускаю команду "xinput reattach 7 2" в lxterminal из tightVNC, щелчок левой кнопкой мыши снова начинает работать! Но я все еще не знаю команду для сенсорного экрана нажмите восстановление. : (

0
20.04.2019, 23:16
5 ответов

Ваш ответ может делать то, что вы хотите, но его можно улучшить.

  • Вы хотите свести к минимуму количество (простых )команд и количество труб, в пределах разумного. Наличие большего их количества, чем вам нужно, может быть неэффективным. На файле в пять-десять строк этого не заметишь, но когда вы обрабатываете файл с миллионом строк, это может иметь значение.

    Вам не нужно запускать две sedкоманды (одну в другую ). Вы можете сделать

    sed -e '(firstscommand)' -e '(secondscommand)'
    или
    sed '(firstscommand); (secondscommand)'
  • Из вашего примера вывода следует, что вы хотите эта вкладка превратилась в пробел только в первой строке, поэтому ваша команда s/\t/ /также должна иметь префикс 1.
  • Поведение s/…/…/6gне определено. Поскольку вы хотите, чтобы s/\t/ /выполнялось только один раз (на 6-й вкладке ), вы должны сказать простоs/\t/ /6(безg).

Таким образом, ваша команда может быть

sed '1s/\t/\t0\t/4; 1s/\t/ /6' file

Фигурные скобки позволяют группировать команды, которые вы хотите выполнять вместе. Так что вы могли бы также сказать

sed '1{s/\t/\t0\t/4; s/\t/ /6}' file

авк

Вы можете сделать это в awk следующим образом:

awk -F '\t' -v OFS='\t' 'NR==1 { $6 = $5 " " $6; $5 = "0" }
                { print }
    ' file
1
28.01.2020, 02:30

Используйтеsed -e '1s/\t/\t0\t/4' -e 's/\t/ /6g' file

Первая команда sed заменит первое вхождение <tab>на <tab>0<tab>в 4-м столбце первой строки. Вторая команда sed заменит все <tab>на <space>в 6-м столбце.

0
28.01.2020, 02:30

Кажется, что у вас есть шесть столбцов, разделенных табуляцией -, но какая-то обработка оставила первое слово 6-го столбца в 5-м столбце, когда значение в 5-м столбце отсутствует. Вероятно, это связано с тем, что на предыдущем шаге обработки в качестве разделителей использовались пробелы или общие пробелы, а не табуляция.

Теперь вы хотите вставить ноль в 5-ю колонку и переместить там слово на законное место в 6-й колонке.

Я предполагаю, что файл выглядит следующим образом, где каждый ^Iявляется символом табуляции (это вывод cat -tв файле):

GCF_000014165.1_ASM1416v1.dist_nbr_anntn^IWP_011558474.1^I1155234^I1156286^Ipolyketide^Isynthase [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn^IWP_011558475.1^I1156298^I1156807^I12^Icarboxyl methyltransferase [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn^IWP_011558476.1^I1156804^I1157820^I-3^Ioxidoreductase [Mycobacterium]

Неясно, есть ли пустой столбец 2. Если он есть, просто добавьте один к номерам столбцов, которые я использую ниже.

$ awk -F '\t' 'BEGIN { OFS=FS } $5 ~ /[[:alpha:]]/ { $6 = $5 " " $6; $5 = 0 } { print }' file
GCF_000014165.1_ASM1416v1.dist_nbr_anntn        WP_011558474.1  1155234 1156286 0       polyketide synthase [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn        WP_011558475.1  1156298 1156807 12      carboxyl methyltransferase [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn        WP_011558476.1  1156804 1157820 -3      oxidoreductase [Mycobacterium]

Здесь я использую awkдля обнаружения любой буквы алфавита в 5-м столбце. Если он есть, перед 5-м столбцом ставится разделительный пробел перед 6-м столбцом, а 5-й столбец устанавливается равным нулю. Затем выводятся все строки, измененные или нет.

2
28.01.2020, 02:30

Попытался выполнить команду ниже, все работает нормально

awk 'NR==1 {$8=$7;$7=$6;$6=$5;$5=0}1' filename| sed -r "s/\s+/ /g"| sed "s/ /\t/g"

выход

GCF_000014165.1_ASM1416v1.dist_nbr_anntn    WP_011558474.1  1155234 1156286 0   polyketide  synthase    [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn    WP_011558475.1  1156298 1156807 12  carboxyl    methyltransferase   [Mycobacterium]
GCF_000014165.1_ASM1416v1.dist_nbr_anntn    WP_011558476.1  1156804 1157820 -3  oxidoreductase  [Mycobacterium]
-1
28.01.2020, 02:30

Вы можете нарезать и нарезать массивы с помощью splice, встроенного в ваш сценарий, как показано:

$ perl -F\\t -pale '
  next unless $. == 1;
  splice @F, 4, 2, 0, join $", @F[-2,-1];
  $_ = join "\t", @F;
' input.file
0
28.01.2020, 02:30

Теги

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