Добавление другого суффикса в конец строки [дубликат]

Это можно сделать с помощью sed как:

Код:

sed '/C.*C/p;/C/d' file1

Результаты:

DTHGTY
HYTRHD
HTCCYD

Как?

  1. Найдите и напечатайте любую строку, содержащую не менее двух копий C через /C.*C/p
  2. Удалить любую строку с C через /C/d, сюда входят строки, уже напечатанные на шаге 1
  3. По умолчанию печатать остальные строки
0
11.02.2017, 23:59
3 ответа

Решение, которое предоставил @Kusalananda, превосходит это. Я предоставил его, не задумываясь о том, что $ (cat ...) делает с точки зрения использования памяти. Я оставлю его здесь для справки - он будет работать и не страшен, если файлы маленькие.

#!/bin/bash

for name in $(cat names); do
    for year in $(cat years); do
        echo "${name}${year}"
    done
done
1
28.01.2020, 02:16
$ join -j2 -t : names year | tr -d :
  • объединить по несуществующему полю и удалить разделители выходных полей.

Поле 2 пусто и одинаково для всех элементов в name и year , поэтому join объединит каждое имя со всеми годами: это на самом деле вычисление декартова произведения.

1
28.01.2020, 02:16

Предполагая, что файлы маленькие, их можно прочитать в массивы (с bash или ksh93 ):

names=( $( <names.txt ) )
years=( $( <years.txt ) )

Затем вы можете построить двойной цикл, который объединяет каждое имя с каждым годом по очереди:

for n in "${names[@]}"; do
  for y in "${years[@]}"; do
    printf '%s%s\n' "$n" "$y"
  done
done

If years. txt маленький, но names.txt большой:

years=( $( <years.txt ) )

while read n; do
  for y in "${years[@]}"; do
    printf '%s%s\n' "$n" "$y"
  done
done <names.txt

Результат:

John2017
John2015
John2018
Jack2017
Jack2015
Jack2018
Jerry2017
Jerry2015
Jerry2018

Обработка файлов как одностолбцовых, без заголовков, CSV-файлов:

$ csvsql -H --query "SELECT * FROM names CROSS JOIN years" names.txt years.txt | sed -e '1d' -e 's/,//'

Выполняется реляционная операция перекрестного соединения данных в двух таблицах, а затем выполняется on, чтобы удалить первую строку вывода вместе со всеми запятыми ( csvsql создает правильно отформатированный CSV со строкой заголовка и значениями, разделенными запятыми).

csvsql является частью csvkit .

3
28.01.2020, 02:16

Теги

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