У меня есть текстовый файл:
cat test1
ch140/121_------_T_201607061430
ch140/121_------_T_201611070840
ch140/121_------_T_201611071125
ch140/121_------_T_201611071235
Я хочу добавить к этому файлу построчно этот текст:
/121_------_T_201607061430
/121_------_T_201611070840
/121_------_T_201611071125
/121_------_T_201611071235
Результат должен быть:
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
Я использовал:
cat test1 | sed -e 's/ch140//' > test2
for a in $(cat test2)
do
????
done
Какую команду я могу использовать для этого?
Я пробовал использовать команду sed
, но это не сработало.
sed 's/\/121.*/&&/' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
s / old / new /
заменить old
на new
\ / 121. *
match / 121
и все, что идет после него &&
совпавший шаблон два раза Вы можете добавить tee
или использовать перенаправление для сохранения в новый файл
sed 's/\/121.*/&&/' test1 | tee test2
Команда paste
делает то же, что и cat
, но рядом. -d ''
предназначен для paste
, чтобы использовать пустой разделитель, поэтому между строками ничего нет.
$ paste -d '' test1 test2
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
Если файлы имеют разную длину, вы можете изучить этот вопрос , чтобы избежать неприглядных результатов.
Вы также можете использовать awk
:
$ awk -F'/' -vOFS="/" '{print $0,$2}' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
Здесь я устанавливаю ввод ( -F "/"
) и выходные ( -vOFS = "/"
) разделители полей в /
. Это означает, что $ 2
будет всем после первого /
и до следующего /
. Поскольку в каждой строке только один /
, $ 2
- это текст, который вы хотите добавить. Скрипт напечатает каждую строку ( $ 0
), а затем добавит второе поле ( $ 2
).
Вы также можете использовать тот же подход в Perl:
$ perl -F"/" -anle 'print "$_/$F[1]"' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235
В качестве альтернативы вы можете использовать тот же подход, что и в ответе @ Zanna sed
:
$ perl -pe 's#/.*#$&$&#' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235