Bash 如何替换10000行中的文本

Bash 如何替换10000行中的文本,bash,awk,sed,Bash,Awk,Sed,我有超过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') nam

我有超过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')
首先,我尝试在每行的开头添加名称。让我们想象一下,我的文件每行包含所有这些字符串,它被称为exampleout.txt。这给了我三个时间名字,而不是一次

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

然后我尝试粘贴[2]请您尝试以下内容

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')

使用sed很容易将regex匹配替换为其他匹配

替换文本中的表达式\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 for NR==FNR。

您实际上可以在一个命令中完成所有操作。下面的脚本类似于sed,只是我选择使用perl来利用非贪婪匹配。*?..*来分隔第一个带下划线的字段

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

请注意,使用-E标志来扩展正则表达式/更容易捕获组,使用双引号来使用单引号作为替换的一部分。

您是否有自己的尝试?您考虑过哪些工具?@Learner,IMHO,即使您的尝试失败或不正确,也总是建议您将其添加到您的帖子中,因为我们都是来相互学习的。请您在您的帖子中添加它们,然后让我们知道。@Inian我添加了我对bash所能做的一切:-@Learner:awk/sed不是bash对于您的第一个案例,MLKT_CS_4942_01A来自哪里?我喜欢您的答案,谢谢lotI喜欢您的答案,谢谢lotI接受您的答案,因为它很简单。不过,我希望你能花点时间解释一下,谢谢你。我认为这是非常明显的,它在做什么,所以没有必要解释——你有没有不明白的具体部分,你有什么问题?只有这一部分,你是如何理解这个表达的?x=2美元;sub/^[^ _]+/,x是否可能以某种方式将输出中断到df?之前的下一行,因此输出看起来像这个名称mlkt_3C_AAAU_01A[2]q1不确定您的意思,我只是将输入文本保存在一个变量中,然后从中删除第一行之前的所有内容。q2任何事情都有可能,但您不能将格式化代码放在注释中,所以idk知道您要求的是什么。如果要在输出中使用换行符,只需将\n放入输出字符串中所需的位置即可-例如,如果要将foo-df更改为foodf,则只需将代码更改为print foo\ndf而不是foo-df。
$ 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')
sed 's/^"\(MLKT_\([^"]*\)\)"$/things with \1 and even \2 in it/' file >newfile
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
perl -pe "s/^\"(.*?_(.*))\"$/names(\1)[2] <- '\2' df <- full_join(df, \1, by 'V1')/" example.txt
sed -E "s/^\"(MLKT_(.*))\"$/names(\1)[2] <- '\2' df <- full_join(df, \1, by 'V1')/" test.txt
$ 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')