运行awk脚本后字符串的截断
我有这个密码运行awk脚本后字符串的截断,awk,Awk,我有这个密码 BEGIN { FS=OFS=";" } { key = $(NF-1) } NR == FNR { for (i=1; i<(NF-1); i++) { if ( !seen[key,$i]++ ) { map[key] = (key in map ? map[key] OFS : "") $i } } next } { print $0 map[key]
BEGIN { FS=OFS=";" }
{ key = $(NF-1) }
NR == FNR {
for (i=1; i<(NF-1); i++) {
if ( !seen[key,$i]++ ) {
map[key] = (key in map ? map[key] OFS : "") $i
}
}
next
}
{ print $0 map[key] }
我有两个文本文件
1.txt
AA;BB;
CC;DD;BB;AA;
2.txt
AA;BB;
CC;DD;BB;AA;
我尝试生成这个3.txt输出
AA;BB;CC;DD;
但是使用这个脚本是不可能的,因为这个脚本只返回AA;BB代码>
逻辑:上面的方法只是在数组索引的散列查找中使用文本字符串,因此它不关心输入中的字符。但是关于示例输出:
如果在2.txt中,则在1.txt中也有公共字段。例如BB;AA
然后需要将它们连接在一行中,即AA;BB;复写的副本;DD不需要代码>排序,例如,如果输出为BB,则不相关;AA;DD;抄送代码>
唯一需要的条件是避免重复,但我的脚本已经做到了这一点请尝试以下内容,根据OP的注释,两个文件只有一行。因此,使用paste
命令组合这两个文件,然后通过awk
命令处理其输出
paste -d';' 1.txt 2.txt |
awk '
BEGIN{
FS=OFS=";"
}
{
for(i=1;i<=NF;i++){
if(!seen[$i]++){ val=(val?val OFS:"")$i }
}
print val
delete seen
val=""
}'
粘贴-d';'1.txt 2.txt|
awk'
开始{
FS=OFS=“;”
}
{
对于(i=1;以上只是在数组索引的散列查找中使用文字字符串,因此它不关心输入中有哪些字符。但是关于示例输出:如果在2.txt中,1.txt中也有公共字段。例如BB;AA;
,则需要将它们串联在一行中,即AA;BB;CC;DD;
不需要排序,例如,如果输出是BB;AA;DD;CC;
则不相关。唯一需要的条件是避免重复,但我的脚本已经做到了这一点。这两个文件都只有一条记录?这个问题中的代码是我向OPs提供的答案,每个输入文件中有多行。FWIW我仍然不明白OP到底是什么正在尝试这样做,因为不清楚此问题的答案将如何应用于上一个问题中显示的多行输入。@EdMorton不,Ed,您的脚本不适用于此示例。您需要解决此问题。我不是说我对您上一个问题的解决方案适用于此问题,我是说不清楚您在说什么我真的很努力,因为这个问题的解决方案对你的上一个问题不起作用,而上一个问题的解决方案对这个问题也不起作用,而且这两个解决方案彼此不兼容。你错了,我需要解决任何问题,但即使我想解决,也没有足够的信息说明你想做什么能够这样做。如果你想在你真正正在做的任何事情上得到帮助,请随时发布新问题。C:\ProgramFiles(x86)\GnuWin32\bin>awk-f tst.awk 2.txt 1.txt awk:tst.awk:1:paste-d';'1.txt 2.txt | awk:tst.awk:1:^表达式中的无效字符'
@TenLogx,这是一个经过测试的解决方案,对我来说效果很好。您需要首先使用粘贴命令,然后使用awk-f
命令,类似于粘贴1st.txt>的东西wk
等。您不需要将文件传递给awk-f
,因为我已经将它们传递给paste
command.ok,我使用paste 1st.txt 2nd.txt | gawk-f tst.awk>“3.txt”如果我不考虑一个记录,也可以提供一个解决方案吗?这是一个简单的例子。机制是相同的,但是两个文件的记录都更多。谢谢。advance@TenLogx,请您尝试一下我编辑过的解决方案,该解决方案应该也适用于多行,请告诉我它是如何运行的?