AWK 脚本以及循环和 if 条件
AWK Script along with loop and if condition
输入文件如下
827 819
830 826
828 752
756 694
828 728
821 701
724 708
826 842
719 713
764 783
752 828
694 756
#
是我的第一行,$2 是我的第二行。我试图省略第 11 行等行,它与第 3 行相同但具有交换值。基本上,对于每个也有 $2 $1 的 $1 $2,我想省略后者。这只是数据的一小部分。实际数据集中有很多这样的值。`
我试过以下方法:
awk -F “ “ ‘{ for i in cat 686.edges.txt | if [ expr == expr ] then #Evaluating the condition from file
和
awk -F “ “ ‘{ print }’ >> t.txt else ‘{ print “ Not found “ } fi #Printing all the $y $x into a file
和
awk -F “ “ ‘{ for i in cat t.txt} | grep -v " " 686.edges.txt >> new.txt
我正在读取来自 t.txt 的输入,这是先前操作的结果,并将所有输入从主文件中删除并将其写入 new.txt
我一直遇到错误,无法执行。任何人都可以评估以上并纠正我。
这将打印所有行,除非之前已经看到该行的反面:
$ awk '!seen[" "] {print} {seen[[=10=]]=1}' t.txt
827 819
830 826
828 752
756 694
828 728
821 701
724 708
826 842
719 713
764 783
这假定列由 space 分隔。例如,如果它们被制表符分隔,则需要对代码进行较小的更改。
要将输出写入 new.txt
而不是终端,请使用:
awk '!seen[" "] {print} {seen[[=11=]]=1}' t.txt >new.txt
工作原理
awk
一次读入一条记录(行)。每行分为字段(列)。我们使用数组 seen
来跟踪以前看到过哪些(反转的)行。
!seen[" "] {print}
如果当前行的反面以前没有见过,则打印该行。 (!
是 "not" 的 awk 符号。)
{seen[[=20=]]=1}
将当前行标记为可见。
备用:忽略以前看到的行,不管顺序如何
这将忽略打印之前按原样或倒序显示的任何行:
awk '0==seen[[=12=]] {print} {seen[[=12=]]=1; seen[" "]=1}' t.txt >new.txt
使用多维数组的解决方案
按照Glenn Jackman的建议,如果你的awk支持多维数组,那么以上两种方案都可以写成:
awk --posix '!seen[,] {print} {seen[,]=1;}' t.txt >new.txt
和
awk '!seen[,] {print} {seen[,]=1; seen[,]=1}' t.txt >new.txt
shellter 指出最初的 AWK 编程语言(第 52-3 页)支持这种表示法。另一方面,Grymoire describes this notation as "invalid". So, it may not work on all versions of awk. It is, however, supported by GNU awk (Linux). Because this notation is required by POSIX,它应该适用于所有 modern awks。
输入文件如下
827 819
830 826
828 752
756 694
828 728
821 701
724 708
826 842
719 713
764 783
752 828
694 756
#
是我的第一行,$2 是我的第二行。我试图省略第 11 行等行,它与第 3 行相同但具有交换值。基本上,对于每个也有 $2 $1 的 $1 $2,我想省略后者。这只是数据的一小部分。实际数据集中有很多这样的值。`
我试过以下方法:
awk -F “ “ ‘{ for i in cat 686.edges.txt | if [ expr == expr ] then #Evaluating the condition from file
和
awk -F “ “ ‘{ print }’ >> t.txt else ‘{ print “ Not found “ } fi #Printing all the $y $x into a file
和
awk -F “ “ ‘{ for i in cat t.txt} | grep -v " " 686.edges.txt >> new.txt
我正在读取来自 t.txt 的输入,这是先前操作的结果,并将所有输入从主文件中删除并将其写入 new.txt
我一直遇到错误,无法执行。任何人都可以评估以上并纠正我。
这将打印所有行,除非之前已经看到该行的反面:
$ awk '!seen[" "] {print} {seen[[=10=]]=1}' t.txt
827 819
830 826
828 752
756 694
828 728
821 701
724 708
826 842
719 713
764 783
这假定列由 space 分隔。例如,如果它们被制表符分隔,则需要对代码进行较小的更改。
要将输出写入 new.txt
而不是终端,请使用:
awk '!seen[" "] {print} {seen[[=11=]]=1}' t.txt >new.txt
工作原理
awk
一次读入一条记录(行)。每行分为字段(列)。我们使用数组 seen
来跟踪以前看到过哪些(反转的)行。
!seen[" "] {print}
如果当前行的反面以前没有见过,则打印该行。 (
!
是 "not" 的 awk 符号。){seen[[=20=]]=1}
将当前行标记为可见。
备用:忽略以前看到的行,不管顺序如何
这将忽略打印之前按原样或倒序显示的任何行:
awk '0==seen[[=12=]] {print} {seen[[=12=]]=1; seen[" "]=1}' t.txt >new.txt
使用多维数组的解决方案
按照Glenn Jackman的建议,如果你的awk支持多维数组,那么以上两种方案都可以写成:
awk --posix '!seen[,] {print} {seen[,]=1;}' t.txt >new.txt
和
awk '!seen[,] {print} {seen[,]=1; seen[,]=1}' t.txt >new.txt
shellter 指出最初的 AWK 编程语言(第 52-3 页)支持这种表示法。另一方面,Grymoire describes this notation as "invalid". So, it may not work on all versions of awk. It is, however, supported by GNU awk (Linux). Because this notation is required by POSIX,它应该适用于所有 modern awks。