AWK:读取所有行&完全基于另一个文件的每一行操作一个文件

AWK:读取所有行&完全基于另一个文件的每一行操作一个文件,awk,shell,scripting,Awk,Shell,Scripting,我有两个输入文件: File1.txt: Name Latin-small Roman Latin-caps #header, not to be processed F0, a, I, A F1, b, II, B F2, c, III, C F3, d,

我有两个输入文件:

File1.txt:

Name    Latin-small    Roman        Latin-caps #header, not to be processed
F0,        a,              I,            A
F1,        b,              II,           B
F2,        c,              III,          C
F3,        d,              IV,           D
File2.txt:

Lorem ipsum
Roman here.
LCaps here.
LSmall here.
Lorem ipsum
我从script.sh的File1.txt第6行的每一行获得R、LC和LS的赋值。 生成名为Fx的文件夹,其中x=0、1、2、3,。。。使用script.sh的File1.txt第7行。 使用File2.txt生成的名为Fx.txt的单个文件必须放在script.sh的第7行文件夹中。
现在,在读取File1.txt的一行之后,它应该读取script.sh的第7行&查看键修改整个File2.txt 正如您所发现的,Awk一次只能处理一行。但是我们可以把事情扭转过来,将输入文件读入内存,然后在读取另一个文件时重复循环它的行

您的示例在file1.txt中的项目之间有一个逗号和一个空格,但我假设这不是一个硬性要求,因此该脚本需要以制表符分隔的输入

awk -F "\t" 'BEGIN { split(":LSmall:Roman:LCaps", k, /:/) }
    NR==FNR { a[NR] = $0; n=NR; next }
    FNR==1 { next }  # skip header
    {
        system("mkdir "$1)
        filename=$1"/"$1".txt"        
        for(i=1; i<=n; i++) {
            line = a[i]
            for (j=2; j<=NF; ++j) {
                if (line ~ k[j]) {
                    gsub(/here/, $j, line)
                    break
                }
        }
        print line >>filename }
    }' file2.txt file1.txt

演示:

目标与[通过将文件2的所有行与文件1的每一行进行比较来读取两个文件,但这里需要由AWK完成。我不明白输出是如何生成的以及它应该位于何处。为什么是文件2?为什么文件夹F2不是F0?为什么是希腊文III,为什么是III而不是I?@,添加了我用代码获得的输出。用文字更正了错误。@,我补充道更多细节,希望能澄清。这也有点复杂,无法从我这边正确传达。请随时询问更多信息。只需@user ping一个用户,就不需要复制配置文件URL,事实上这可能会阻止ping工作。但现在可能没有必要ping这些用户。
 Lorem ipsum
 Roman               IV.
 LCaps           D.
 LSmall         d.
 Lorem ipsum
 Lorem ipsum
 Roman III.
 LCaps C.
 LSmall c.
 Lorem ipsum
awk 'BEGIN {FS=","}
 {
  if ($1 !~ "F")
    {}
  else if ($1 ~ "F")
    {LS = $2; R = $3; LC = $4;
    system("mkdir "$1); filename=$1"/"$1".txt";
    {(getline < "File2.txt");
      {
        if ($0 ~ "Roman")
          {gsub("here",R); print >> filename;}
        else if ($0 ~ "LSmall")
          {gsub("here",LS); print >> filename;}
        else if ($0 ~ "LCaps")
          {gsub("here",LC); print >> filename;}
        else
          {print >> filename;}
      }
    }
    }
  }
' File1.txt
Lorem ipsum
Roman               II.
LCaps           C.
LSmall         d.
awk -F "\t" 'BEGIN { split(":LSmall:Roman:LCaps", k, /:/) }
    NR==FNR { a[NR] = $0; n=NR; next }
    FNR==1 { next }  # skip header
    {
        system("mkdir "$1)
        filename=$1"/"$1".txt"        
        for(i=1; i<=n; i++) {
            line = a[i]
            for (j=2; j<=NF; ++j) {
                if (line ~ k[j]) {
                    gsub(/here/, $j, line)
                    break
                }
        }
        print line >>filename }
    }' file2.txt file1.txt