AWK:读取所有行&完全基于另一个文件的每一行操作一个文件
我有两个输入文件: File1.txt: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,
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