awk - 为两个文本文件中的多行扩展 awk 脚本,而不是如果两个文件只有一条记录

标签 awk

我可以生成这个 3.txt 输出

AA;BB;CC;DD;

来自 2 个文本文件。两个文件只有一条记录

1.txt

AA;BB;

2.txt

CC;DD;BB;AA;

我使用这个 awk 脚本。

BEGIN{
  FS=OFS=";"
}
{
  for(i=1;i<=NF;i++){
    if(!seen[$i]++){ val=(val?val OFS:"")$i }
  }
  print val
  delete seen
  val=""
}

我是这样使用的,我使用paste命令来合并两个文件,然后通过awk命令处理它的输出。

paste 1st.txt 2nd.txt | awk -f tst.awk > "3.txt"

但我想要什么?
我需要考虑更多的单一记录。我尝试针对这种情况调整此脚本。可以看到现在两个文件都不止一条记录了。

1.txt

UU;    
AA;BB;
ZZ;KK;

2.txt

CC;DD;BB;AA;
LL;KK;
GH;ZZ;SS;

我尝试生成的输出 3.txt 是这个

UU;
AA;BB;CC;DD;
ZZ;KK;LL;GH;SS;

处理逻辑:

上面的代码只是在数组索引的散列查找中使用文字字符串,因此它不关心您输入的字符是什么。
但是关于示例输出:如果在 2.txt 中也有公共(public)字段在 1.txt.for example BB;AA; 那么你需要将它们连接成一行,即 AA;BB;CC;DD;不需要排序,例如,如果输出为 BB;AA;DD;CC; 则不相关,唯一需要的条件是避免同一行中的重复字段

当我说“避免重复”时,我的意思是避免这种输出

AA;BB;CC;DD;BB;AA;

因为输出应该是

AA;BB;CC;DD;

最佳答案

也许这就是你想要的:

BEGIN{FS=OFS=";"}
{sub(/;$/,"")}
NR==FNR{
    for (i=1;i<=NF;++i)
        for (j=1;j<=NF;++j)
            if (j!=i&&!b[$i,$j]++)
                a[$i,++c[$i]]=$j
    next
}
{
    delete b
    for (i=1;i<=NF;++i)
        ++b[$i]
    for (i=1;i<=NF;++i)
        for (j=1;j<=c[$i];++j)
            if (!b[a[$i,j]]++)
                $(NF+1)=a[$i,j]
    print
}

像这样使用它:

awk -f script.awk 2.txt 1.txt

以下是之前的一些问题(可能是您的 - 您可能想查看它们并研究如何正确地提出问题):

关于awk - 为两个文本文件中的多行扩展 awk 脚本,而不是如果两个文件只有一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65079080/

相关文章:

bash - 将一个部分复制到一个新文件中

bash - grep 使用另一个 csv 或 txt 文件作为输入的 csv 文件

regex - 使用 sed/awk 从小节中删除字符串

linux - 带 FS 的 Shell awk 命令

linux - 如何使用sed修改文件内容

bash - UNIX AWK 脚本 - 内存耗尽

linux - 比较两个文件中的列并打印不匹配

arrays - 为什么 awk 似乎随机化数组?

bash - awk '{printf "%d ", 49420877107}' 打印错误的数字 2147483647

linux - 使用 grep 和 awk 将文件的第一列转换为 unixtime