Замена содержимого двух столбцов

¿Puede ser que la caja virtual no detecte la unidad USB? Si ese es el caso, debe agregar un controlador USB en la configuración de VM.

-1
21.04.2019, 11:02
3 ответа

Использование замены процесса иpaste:

$ paste <(cut -f2 numbers) <(cut -f1 numbers)
2        1
20       10
200      100
2000     1000
20000    10000
300000   100000
3000000  1000000
0
28.04.2021, 23:34

Я бы сказал, что использование awkдля решения этой задачи подпадает под то, что обычно считается «сценарием оболочки»:

awk -F '\t' 'BEGIN { OFS=FS } { print $2, $1 }'

Это сначала устанавливает разделитель ввода на табуляцию с помощью -F '\t', а затем блок BEGINустанавливает разделитель вывода на тот же символ. Тело единственного блока просто выводит два поля в противоположном порядке.

Тестирование:

$ awk -F '\t' 'BEGIN { OFS=FS } { print $2, $1 }' numbers
2       1
20      10
200     100
2000    1000
20000   10000
300000  100000
3000000 1000000

Более общий подход к обращению всех столбцов независимо от их количества.:

BEGIN { OFS=FS }
{
    for (i = 1; i <= NF/2; ++i ) { 
        t=$i; $i=$(NF-i+1); $(NF-i+1)=t
    }
    print
}

Проходит по столбцам от начала до середины строки, заменяя каждый столбец соответствующим столбцом с конца. Для входных данных с нечетным числом столбцов средний столбец останется нетронутым.


Использование вашего первоначального подхода к созданию временного файла с одним из столбцов также сработает:

cut -f 2 numbers >tmpfile

Вставка исходного файла в это создаст набор данных с тремя столбцами (столбцы 2, 1 и 2 снова):

paste tmpfile numbers

Затем мы можем удалить последний столбец с помощьюcut:

paste tmpfile numbers | cut -f 1,2

Или мы можем сделать это без использования этого временного файла, чтобы начать с:

cut -f 2 numbers | paste - numbers | cut -f 1,2

Обратите внимание, что все решения, использующие cut, по необходимости должны будут считывать исходные данные дважды (, как правило, столько раз, сколько имеется столбцов, если вы хотите инвертировать все столбцы ).

0
28.04.2021, 23:34

Если вы хорошо разбираетесь в Perl, вам может пригодиться одна из подборок таких утилит. Здесь ввод TSV находится в файле z5:

$ recut 2,1 z5
2       1
20      10
200     100
2000    1000
20000   10000
300000  100000
3000000 1000000

Некоторая информация о перекройке в коллекции The Missing Textutils :

recut   Process fields like cut, allow repetitions and re-ordering. (what)
Path    : ~/bin/recut
Version : - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 )
Length  : 56 lines
Type    : Perl script, ASCII text executable
Shebang : #!/usr/bin/perl
Home    : http://www1.cuni.cz/~obo/textutils/ (doc)
Modules : (for perl codes)
 Getopt::Long   2.42

Наш магазин разработал тактику для решения подобных ситуаций:

$ my-tac --field=0 z5
2 1
20 10
200 100
2000 1000
20000 10000
300000 100000
3000000 1000000

Мы еще не выпустили нашу библиотеку, но если вы хотите -создать ее заново, вот помощь:

my-tac - reverse any one property: lines (like tac), fields, characters.

The default is to reverse the lines in a file, so a file like:
        a
        b
        c
will be printed as:
        c
        b
        a

usage: my-tac [options] -- [files]

options:

--help (or -h)
  print this message and quit.

--character
  Reverse order of characters in each line.  That is, given:
    abc
  the result is:
    cba

--field=0
  Reverse order of fields.  That is, given:
    Now is the time
  the result is:
    time the is Now

--field=i,j,k
  Reverse content of specific fields i,j,k.  That is given
    Now is the time
  my-tac --field=1,3  wil result in:
    woN is eht time

--para
  Reverse order of paragraphs, which are groups of lines
  separated by one of more empty lines.  If the last paragraph is
  not followed by an enpty line, one is supplied.

--number=n
  Print only n lines for a file reversal. <no limit>.

--debug
  Print internal debugging information.  <off>.
  (Must be first option.)

--separator=",re,string"
  Set the input separator to regular expression re, <\s+>, and
  the output separator to string, < >.  So the default is
  ",\s+, ".  Any character may be used in place of the comma, so
  you could specify:
    --separator=';\s+;|'

С наилучшими пожеланиями... ура, дрл

1
28.04.2021, 23:34

Теги

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