Как удвоить каждую строку и изменить цифры в каждой строке по-разному в Linux?

Входной файл выглядит так:

1 0 0 000 3444 2 3 3 456 6875 3 0 0 023 3300 4 2 2 211 1000 

сначала: я хочу иметь 2 копии каждой строки:

 1 0 0 000 3444 1 0 0 000 3444 2 3 3 456 6875 2 3 3 456 6875 3 0 0 023 3300 3 0 0 023 3300 4 2 2 211 1000 4 2 2 211 1000 

второй: в первой копии каждой строки 3 следует заменить на 2 и 4, следует заменить на 1 и во второй копии каждой строки, 3 следует заменить на 1 и 4, следует заменить на 2 (первый столбец – имена строк и номера строк не должны меняться). Таким образом, конечный результат становится:

 1 0 0 000 2111 1 0 0 000 1222 2 2 2 156 6875 2 1 1 256 6875 3 0 0 022 2200 3 0 0 021 1100 4 2 2 211 1000 4 2 2 211 1000 

любое предложение, пожалуйста? Я пробовал это, но он не работает:

 awk ' { tmp = $2; gsub("3", "2", $2); gsub("4", "1", $2); print} { $2 = tmp; gsub("3", "1", $2); gsub("4", "2", $2); print} ' < input > output 

  • Как добавить новый текст после каждой строки с использованием команды оболочки?
  • Как использовать awk для создания индекса слов в файле?
  • Объедините две строки в один выбор выбранных слов из обоих
  • awk с несколькими if и заменой
  • сравнить файлы на основе двух столбцов и добавить поле
  • Вырезание текста между двумя запятыми, исключая последующий текст
  • Как рассчитать (взвешенное) большинство по столбцам?
  • Удалить строку, содержащую нечувствительность к регистру
  • 3 Solutions collect form web for “Как удвоить каждую строку и изменить цифры в каждой строке по-разному в Linux?”

    Как удвоить каждую строку: см. Здесь …
    Что касается вашего второго запроса, просто сохраните 1-е поле и всю строку в переменных, затем выполните первое изменение, установите первое поле в начальное значение и распечатайте, затем восстановите содержимое линии, выполните второе изменение, снова установите 1-ое поле начальное значение и печать:

     awk '{t=$1;l=$0;gsub(/3/, "2");gsub(/4/, "1");$1=t;print} {$0=l;gsub(/3/, "1");gsub(/4/, "2");$1=t;print}' infile 

    Perl кажется довольно приятным для такого рода вещей, поскольку он имеет встроенный tr

     $ perl -alne ' @tmp=@F; tr/34/21/ for @tmp[1..4]; print join " ", @tmp; tr/34/12/ for @F[1..4]; print join " ", @F ' file 1 0 0 000 2111 1 0 0 000 1222 2 2 2 156 6875 2 1 1 256 6875 3 0 0 022 2200 3 0 0 021 1100 4 2 2 211 1000 4 2 2 211 1000 

    Не совсем элегантный, но это возможно с помощью GNU sed :

     h # save in hold s_^[0-9]\{1,\} __ # remove first column s_3_A_g # change 3 and 4 to A and B s_4_B_g x # swap with hold s_ .*$__ # remove everything but first column G # append from hold s_\n_ _ # join lines (with space) h # save in hold space again s_A_2_g # first output -> 2, 1 s_B_1_g p # print first line g # restore from hold s_A_1_g # second output -> 1, 2 s_B_2_g # end of script, second line printed automatically 

    Это сохраняет первый столбец (так что он не будет изменен) и строит версию строки со всеми остальными 3s и 4s, измененными соответственно на As и Bs. Затем эта линия используется для обоих выходов, сначала с 2 и 1 , затем наоборот.

     sed -f script.sed input > output 

    Это предполагает, что ваш ввод содержит только числа и пробелы, т. Е. A и B уже не появляются.

    Linux и Unix - лучшая ОС в мире.