как я могу заменить текст в 10000 строк - PullRequest
0 голосов
/ 05 февраля 2019

У меня более 10000 таких файлов, и я пытаюсь сделать их как шаблон

мои строки похожи на это

"MLKT_3C_AAAU_01A" 
"MLKT_3C_AALI_01A"
"MLKT_3C_AALJ_01A" 
"MLKT_3C_AALK_01A"
"MLKT_4H_AAAK_01A"

Я пытаюсь преобразовать их в этот

names(MLKT_3C_AAAU_01A)[2] <- '3C_AAAU_01A' df<- full_join(df,MLKT_CS_4942_01A, by = 'V1')
names(MLKT_3C_AALI_01A)[2] <- '3C_AALI_01A' df<- full_join(df,MLKT_3C_AALI_01A, by = 'V1')
names(MLKT_3C_AALJ_01A)[2] <- '3C_AALJ_01A' df<- full_join(df,MLKT_3C_AALJ_01A, by = 'V1')
names(MLKT_3C_AALK_01A)[2] <- '3C_AALK_01A' df<- full_join(df,MLKT_3C_AALK_01A, by = 'V1')
names(MLKT_4H_AAAK_01A)[2] <- '4H_AAAK_01A' df<- full_join(df,MLKT_4H_AAAK_01A, by = 'V1')

Лучший способ, с которым я сталкивался до сих пор, - это использовать текстовый редактор и создавать их один за другим.Мне интересно, есть ли способ в bash получить приведенные выше строки и преобразовать их в приведенный мною пример?

Перед тем как начать, я удаляю цитату из каждой строки

sed 's/\"//g' example.txt > exampleout.txt

ATсначала я пытаюсь добавить names( в начале каждой строки.так что давайте представим, что мой файл, содержащий все эти строки в строке, называется exampleout.txtкоторый дает мне три имени времени (вместо одного раза

awk '$0="names("$0' exampleout.txt > myout.txt

Затем я пытаюсь вставить )[2] <- '' df<- full_join(df,, by = 'V1') в конце каждой строки, используя следующие

sed -e 's/$/)[2] <- '' df<- full_join(df,, by = 'V1') /' myout.txt > myout2.txt

, так что это привело меня к этому

names(MLKT_3C_AAAU_01A )[2] <-  df<- full_join(df,, by = V1) 
names(MLKT_3C_AALI_01A)[2] <-  df<- full_join(df,, by = V1) 
names(MLKT_3C_AALJ_01A )[2] <-  df<- full_join(df,, by = V1) 
names(MLKT_3C_AALK_01A)[2] <-  df<- full_join(df,, by = V1) 
names(MLKT_4H_AAAK_01A)[2] <-  df<- full_join(df,, by = V1) 

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019
$ awk -F'"' '{
    x=$2; sub(/^[^_]+_/,"",x)
    printf "names(%s)[2] <- \047%s\047 df<- full_join(df,%s, by = \047V1\047)\n", $2, x, $2
}' file
names(MLKT_3C_AAAU_01A)[2] <- '3C_AAAU_01A' df<- full_join(df,MLKT_3C_AAAU_01A, by = 'V1')
names(MLKT_3C_AALI_01A)[2] <- '3C_AALI_01A' df<- full_join(df,MLKT_3C_AALI_01A, by = 'V1')
names(MLKT_3C_AALJ_01A)[2] <- '3C_AALJ_01A' df<- full_join(df,MLKT_3C_AALJ_01A, by = 'V1')
names(MLKT_3C_AALK_01A)[2] <- '3C_AALK_01A' df<- full_join(df,MLKT_3C_AALK_01A, by = 'V1')
names(MLKT_4H_AAAK_01A)[2] <- '4H_AAAK_01A' df<- full_join(df,MLKT_4H_AAAK_01A, by = 'V1')
0 голосов
/ 05 февраля 2019

Замена соответствия регулярному выражению чем-то легко сделать с помощью sed.

sed 's/^"\(MLKT_\([^"]*\)\)"$/things with \1 and even \2 in it/' file >newfile

Выражение \1 в тексте замены соответствует первой группе в скобках в регулярном выражении, а \2соответствует второму.Поэтому, если вы выбрали MLKT_1234, то \1 будет всей строкой, а \2 будет 1234.

Если вам нужны одинарные кавычки в замене, вам нужно как-то развернуть их.Возможно, самая простая механическая замена состоит в том, чтобы выразить каждую буквальную одинарную кавычку в виде '\'', которая является закрывающей одинарной кавычкой для строки в одинарных кавычках, в которой вы находитесь, затем литеральной не заключенной в кавычки, но обратной кавычкой, а затем открывающей одинарной кавычкой для продолжения одинарной кавычки.-цитатуру следующего текста.

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

awk '{ # replace double quotes with nothing
    sub(/^"/, ""); sub(/"$/, "");
    # Now you can use $0 to refer to the remaining string
    # You can replace single quotes with \047
    print "names(" $0 ")[2] <- \047" \
        substr($0, 6) "\047 df<- full_join(df," \
        randomstring ", by = \047V1\047)" }' file >newfile

Если randomstring взято извторой файл, есть общий шаблон Awk для объединения значений из двух файлов (Google для NR==FNR).

0 голосов
/ 05 февраля 2019

Вы можете сделать все это одной командой.Сценарий ниже похож на sed, только я решил использовать perl для использования не жадного сопоставления (.*?_(.*)) для разделения первого подчеркнутого поля.

perl -pe "s/^\"(.*?_(.*))\"$/names(\1)[2] <- '\2' df <- full_join(df, \1, by 'V1')/" example.txt

Здесь язахватили две строки.

  1. Все внутри двойных кавычек и
  2. Все после первого подчеркивания.

Например, в "MLKT_3C_AAAU_01A" первый захват будет MLKT_3C_AAAU_01A, а второй захват будет 3C_AAAU_01A.

После этого будут сделаны соответствующие замены.


Если поле, предшествующее первому подчеркиваниюявляется константой (например, MLKT), вы можете использовать sed, заменяя не жадное совпадение константой.

sed -E "s/^\"(MLKT_(.*))\"$/names(\1)[2] <- '\2' df <- full_join(df, \1, by 'V1')/" test.txt

Обратите внимание на использование флага -E (для расширенных регулярных выражений /упрощение захвата группы) и использование двойных кавычек (для использования одинарных кавычек в качестве замены).

0 голосов
/ 05 февраля 2019

Не могли бы вы попробовать следующее.

awk -v s1="'" '
match($0,/[a-zA-Z][^"]*/){
  val=substr($0,RSTART,RLENGTH)
  split(val,array,"_")
  print "names(" val"[2] <- " s1 array[2]"_"array[3]"_"array[4] s1 " df<- full_join(df," val", by = " s1 "V1" s1")"
}'  Input_file

Вывод будет следующим.

names(MLKT_3C_AAAU_01A[2] <- '3C_AAAU_01A' df<- full_join(df,MLKT_3C_AAAU_01A, by = 'V1')
names(MLKT_3C_AALI_01A[2] <- '3C_AALI_01A' df<- full_join(df,MLKT_3C_AALI_01A, by = 'V1')
names(MLKT_3C_AALJ_01A[2] <- '3C_AALJ_01A' df<- full_join(df,MLKT_3C_AALJ_01A, by = 'V1')
names(MLKT_3C_AALK_01A[2] <- '3C_AALK_01A' df<- full_join(df,MLKT_3C_AALK_01A, by = 'V1')
names(MLKT_4H_AAAK_01A[2] <- '4H_AAAK_01A' df<- full_join(df,MLKT_4H_AAAK_01A, by = 'V1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...