我可以生成这个 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
以下是之前的一些问题(可能是您的 - 您可能想查看它们并研究如何正确地提出问题):
- https://superuser.com/q/1600078
- awk: preserve row order and remove duplicate strings (mirrors) when generating data
- https://superuser.com/q/1600557
- https://superuser.com/q/1601402
- https://superuser.com/q/1602713
- https://stackoverflow.com/q/64929865
- https://superuser.com/q/1604046
- Dynamic regular expressions in awk
- Truncation of strings after running awk script
关于awk - 为两个文本文件中的多行扩展 awk 脚本,而不是如果两个文件只有一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65079080/