Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用Bash循环通过txt文件中的唯一行_Linux_Bash_Shell_Loops_Xslt - Fatal编程技术网

Linux 使用Bash循环通过txt文件中的唯一行

Linux 使用Bash循环通过txt文件中的唯一行,linux,bash,shell,loops,xslt,Linux,Bash,Shell,Loops,Xslt,我在txt文件中循环使用制表符分隔的行。此txt文件是xml/xslt进程的输出,具有重复项。下面我正在寻找一个使用txt文件的解决方案,但使用XSLT的解决方案同样值得赞赏。请参阅示例txt文件 txtfile.txt:第3行是第1行的副本 hello@example.com running 1111 puppy@kennel.com running 9876 hello@example.com running 1111 husky@siberia.com shutdown 1

我在txt文件中循环使用制表符分隔的行。此txt文件是xml/xslt进程的输出,具有重复项。下面我正在寻找一个使用txt文件的解决方案,但使用XSLT的解决方案同样值得赞赏。请参阅示例txt文件

txtfile.txt:第3行是第1行的副本

hello@example.com  running  1111
puppy@kennel.com   running  9876
hello@example.com  running  1111
husky@siberia.com  shutdown 1234
puppy@kennel.com   running  9876
hello@example.com  running  1111
我的问题是:是否可以在循环中跳过重复的行,以便循环只处理唯一的行?在这种情况下,如何配置循环行1、2、4和跳过行3、5、6

我当前的工作循环读取重复项:

while read name status num
do
    echo "<tag1>"
    echo "<tag2>"$name"</tag2>"
    echo "<tag3>"$status"</tag3>"
    echo "<tag2>"$num"</tag2>"
    echo "</tag1>"

done < txtfile.txt
读取名称状态num时
做
回声“”
回显“$name”
回显“$status”
回显“$num”
回声“”
完成

在我的TXT文件中有数百行,几乎一半是重复的,所以这对我来说是一个巨大的问题!任何想法/解决方案均受欢迎。提前感谢。

我建议使用awk:

$ awk '!a[$0]++{print "<tag1>\n<tag2>" $1 "</tag2>\n<tag3>" $2 "</tag3>\n<tag2>" $3 "</tag2>\n</tag1>"}' file
<tag1>
<tag2>hello@example.com</tag2>
<tag3>running</tag3>
<tag2>1111</tag2>
</tag1>
<tag1>
<tag2>puppy@kennel.com</tag2>
<tag3>running</tag3>
<tag2>9876</tag2>
</tag1>
<tag1>
<tag2>husky@siberia.com</tag2>
<tag3>shutdown</tag3>
<tag2>1234</tag2>
</tag1>
$awk'![$0]+{print“\n”$1”\n“$2”\n“$3”\n”}文件
hello@example.com
跑步
1111
puppy@kennel.com
跑步
9876
husky@siberia.com
关闭
1234
条件
![$0]+
在第一次看到每一行时计算为true,之后计算为false。当条件为真时,打印输出


基本原理是将行
$0
的内容用作数组
a
中的键。如果记录之间的间距有变化,可以使用
!一个[$1,$2,$3]+
,只要这三个字段是相同的,无论它们之间的间距如何,它都会将行计算为相同的。

我建议使用awk:

$ awk '!a[$0]++{print "<tag1>\n<tag2>" $1 "</tag2>\n<tag3>" $2 "</tag3>\n<tag2>" $3 "</tag2>\n</tag1>"}' file
<tag1>
<tag2>hello@example.com</tag2>
<tag3>running</tag3>
<tag2>1111</tag2>
</tag1>
<tag1>
<tag2>puppy@kennel.com</tag2>
<tag3>running</tag3>
<tag2>9876</tag2>
</tag1>
<tag1>
<tag2>husky@siberia.com</tag2>
<tag3>shutdown</tag3>
<tag2>1234</tag2>
</tag1>
$awk'![$0]+{print“\n”$1”\n“$2”\n“$3”\n”}文件
hello@example.com
跑步
1111
puppy@kennel.com
跑步
9876
husky@siberia.com
关闭
1234
条件
![$0]+
在第一次看到每一行时计算为true,之后计算为false。当条件为真时,打印输出


基本原理是将行
$0
的内容用作数组
a
中的键。如果记录之间的间距有变化,可以使用
!而是一个[$1,$2,$3]+
,只要这三个字段是相同的,不管它们之间的间距如何,它都会将行计算为相同。

您可以通过
排序-u
读取该文件以消除重复行:

sort -u /your/file | while read ...

您可以通过
sort-u
读取该文件以消除重复行:

sort -u /your/file | while read ...

可能使用像
这样的排序唯一列表可能使用像
这样的排序唯一列表伟大的解决方案!工作得很好。。尽管我有点懒得编写/编辑扩展的awk命令,如果我可以用另一种方法(Costi发布的sort-u)。我一定会投票,当我有能力在15代表。伟大的解决方案!工作得很好。。尽管我有点懒得编写/编辑扩展的awk命令,如果我可以用另一种方法(Costi发布的sort-u)。当我有15次代表的能力时,我一定会投票。