使用awk的行和列中的信息生成新行

使用awk的行和列中的信息生成新行,awk,Awk,我有一个文件,其中输入的格式如下所述的输入代码。“单词”“frq”和“单词含义”对应于第1、2和3列。第1栏有单词,第2栏有数字,第3栏有单词的含义。我希望将第3列中的含义相互配对,以便在输出中,如果它们在第1列中具有相同的“单词”,则它们位于同一行中。我还想使用“frq”列中的数字来决定这些含义如何相互配对 输入: word frq word_meanings door 12 meaning_a door 25 meaning_b door 3 meaning_c hand

我有一个文件,其中输入的格式如下所述的输入代码。“单词”“frq”和“单词含义”对应于第1、2和3列。第1栏有单词,第2栏有数字,第3栏有单词的含义。我希望将第3列中的含义相互配对,以便在输出中,如果它们在第1列中具有相同的“单词”,则它们位于同一行中。我还想使用“frq”列中的数字来决定这些含义如何相互配对

输入:

word frq  word_meanings

door  12  meaning_a
door  25  meaning_b
door  3   meaning_c
hand  20  meaning_d
hand  17  meaning_e
floor 4   meaning_f
floor 30  meaning_g
floor 20  meaning_h
floor 4   meaning_e
输出将类似于

door meaning_b meaning_a
door meaning_b meaning_c
hand meaning_d meaning_e
floor meaning_g meaning_h
floor meaning_g meaning_e
floor meaning_g meaning_f

为了便于解释,因为“means_b”的frq值为25,所以所有以单词door开头的列的frq值最高,因此,“含义”随后用于创建与其他行中其他含义的配对,其中第一列的单词为door。

通过对文件进行两次遍历,您可以使用第一次遍历收集频率最高的含义,第二次遍历打印出具有这些含义的每一行

在awk中执行此操作的标准方法是使用
NR
FNR
。当
NR==FNR
(当前总记录数等于当前文件中的记录数)时,您知道您是第一次处理该文件。通过使用
next
语句结束该块,可以跳过后面的操作,直接读取文件的下一行

如果到达第二个操作块,您就知道您正在第二次读取文件,可以在其中打印每行的结果

不要忘记在awk命令行上传递两次文件!每次通过一次

这种技术适用于所有类型的“连接”应用程序(在本例中为自连接)


按单词和frq排序,然后让
awk
处理细节:

sort -k1,1 -k2,2nr | 
awk '$1 != word {word = $1; means = $3} means != $3 {print word, means, $3}'
输出:

door   meaning_b  meaning_a
door   meaning_b  meaning_c
floor  meaning_g  meaning_h
floor  meaning_g  meaning_e
floor  meaning_g  meaning_f
hand   meaning_d  meaning_e

到目前为止,你尝试了什么?@John1024我完全被卡住了,我不知道如何组合不同的东西,即使我这样做了,这种组合也不会给我我想要的对(即使它有效),但这就是我所处的
awk'{x[++$1]}NR==1{j=$2;line=$0}$2>j{line=$0}END{for(I in x)print$0}“
需要更改什么,以便在输出中,字段分隔符是逗号?
sort -k1,1 -k2,2nr | 
awk '$1 != word {word = $1; means = $3} means != $3 {print word, means, $3}'
door   meaning_b  meaning_a
door   meaning_b  meaning_c
floor  meaning_g  meaning_h
floor  meaning_g  meaning_e
floor  meaning_g  meaning_f
hand   meaning_d  meaning_e