объединить 1-й столбец и 2-й столбец; 3-й и 4-й столбец и так далее с разделителем

Как у меня это работает, я просто использую следующие псевдонимы
Это направляет файл на «emacsclient -n -c», найденный с помощью fasd.

alias e='f -e "emacsclient -n -c"'

Итак, я могу набрать e exam, чтобы открыть example.txtв клиенте emacs.

0
30.08.2019, 13:16
2 ответа
sed -E 's/([^\t]+)\t([^\t]+)/\1-\2/g'

Пояснение

  • sed -E 's/foo/bar/g':запустить sedс -Eрасширенным регулярным выражением, заменив fooна bar, несколько раз в строке /g.
  • ([^\t]+)\t([^\t]+):соответствует не -символу табуляции [^\t], состоящему из одного или нескольких символов +, и фиксирует его в группе ([^\t]+). Затем следует табуляция, затем символы табуляции, отличные от -, снова в другой группе захвата.
  • \1-\2:замените это первой группой захвата, -, затем второй группой захвата. По сути, замените вкладку на -.

Почему это работает

sedявляется "жадным", т.е. пытается захватить как можно больше символов. Следовательно, две группы захвата будут стараться быть как можно дольше. например. он захватит все a antartica(, заменив его наa-antartica). При следующем запуске поиска он уже прошел antartica, и снова начинает поиск на вкладке после этого слова. Следовательно, следующим совпадением будет 1 1, которое будет заменено на 1-1. Затем этот шаблон будет повторяться для каждой пары столбцов. Жадный +важен. Если вы опустите его, шаблон просто изменит каждую вкладку.

5
28.04.2021, 23:29

Вот некоторые из методов, которые вы можете использовать для ввода "file.tsv":

$ perl -pe 's/\t/("-",$&)[$|--]/ge'  file.tsv

Здесь мы заменяем каждую нечетную вкладку тире.

$ sed -e '
    y/\t/\n/
    :a;s/\n/-/;s//\t/;ta
' file.tsv

Этот код sed сначала изменит все табуляции на новые строки, а затем постепенно изменит нечетные на тире и четные на табуляции.

$ perl -lpe 's/\t(.*?(?:\t|$))/-$1/g' file.tsv

$ perl -F'\t' -lane '
      push @A, join "-", splice @F,0,2 while @F;
      print join "\t", splice @A;
' file.tsv

$ perl -F'\t' -nae '($,,$")=("\t", "-");
   print map { "@F[2*$_,2*$_+1]" } 0..$#F/2;
' file.tsv
0
28.04.2021, 23:29

Теги

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