我有一个看起来像这样的文本文件
Name1 OpenFin
Name2 Chrome
Name3 OpenFin
Name4 Chrome
Name5 OpenFin
Name6 OpenFin
我想对这种方式进行排序,其中所有行OpenFin
首先出现,然后是所有行Chrome
这是我到目前为止所拥有的:
grep OpenFin LoginExcInternal.txt | grep Chrome LoginExcInternal.txt > test.txt
答案1
您的要求的直接翻译:
所有带 的行
OpenFin
首先出现,然后是所有带 的行Chrome
...无需知道哪一种首先是:
{ grep -F OpenFin LoginExcInternal.txt; grep -F Chrome LoginExcInternal.txt; } > test.txt
这也使行保持在原始文件中出现的顺序(无需通过环来防止sort
对整行进行排序)。
答案2
你的命令
grep OpenFin LoginExcInternal.txt | grep Chrome LoginExcInternal.txt > test.txt
只会从原始数据中生成包含Chrome
行上任何位置的字符串的行。这是因为grep
管道的右侧根本不会处理管道中第一个的结果(它将被简单地丢弃)。
grep
当给定要读取的文件名时,将不处理其标准输入流。第一个结果到达标准输入流grep
。
sort -k2r LoginExcInternal.txt >test.txt
您希望第二列中的行Chrome
位于OpenFin
同一列中包含的行之后。上面的方法是通过按相反的字典顺序对第二列上的原始数据进行排序来实现的。
标志-k2r
告诉sort
实用程序以相反的顺序 ( ) 对第二列上的数据进行排序(如果有多于两列,则继续排序)r
。如果两行在第二列中具有相同的值,则整行将用作排序键。
线路与任何其他第二列中的值将与其余行一起排序,并且也是输出的一部分。
如果您关心数据的原始顺序并且不想更改它,并且假设您只想提取第二列中包含这两个值的行(并且没有其他值),则分两步执行:
awk -v value='OpenFin' '$2 == value' LoginExcInternal.txt >test.txt
awk -v value='Chrome' '$2 == value' LoginExcInternal.txt >>test.txt
这对原始数据应用相同的awk
代码两次,变量 中具有不同的值value
。该代码(仅)在第二列中进行字符串比较,并打印具有指定值的行。脚本的第一次运行awk
执行OpenFin
值,第二次运行将Chrome
行添加到其中。
这避免了涉及第一的数据比较中的列,如果第一列的任何值碰巧是Chrome
或,这将是一个问题OpenFin
。此外,由于awk
代码使用字符串比较,因此它避免输出第二列可能包含以下字符串之一的行:子串。
答案3
这是由用户“emirn”回答的,然后由于某种原因被删除。然而,他们的反应非常有效。
我被告知要运行这两个命令:
cat LoginExcInternal.txt | grep OpenFin >> test.txt
cat LoginExcInternal.txt | grep Chrome >> test.txt
谢谢埃米尔!