Linux

用 word 對文件進行排序

  • March 12, 2019

我有一個看起來像這樣的文本文件

Name1 OpenFin
Name2 Chrome
Name3 OpenFin
Name4 Chrome
Name5 OpenFin
Name6 OpenFin

我想排序這是一種OpenFin首先出現所有行的方式,然後是所有行Chrome

這是我到目前為止所擁有的:

grep OpenFin LoginExcInternal.txt | grep Chrome LoginExcInternal.txt > test.txt

您的要求的直接翻譯:

所有帶有的行OpenFin首先出現,然後是所有帶有的行Chrome

…無需知道首先是哪種類型:

{ grep -F OpenFin LoginExcInternal.txt; grep -F Chrome LoginExcInternal.txt; } > test.txt

這也使這些行保持它們在原始文件中出現的順序(無需通過箍來防止sort對整行進行排序)。

你的命令

grep OpenFin LoginExcInternal.txt | grep Chrome LoginExcInternal.txt > test.txt

只會從包含行中Chrome任何位置的字元串的原始數據生成行。這是因為管道中第一個的結果grep根本不會被管道的右側處理(它只會被丟棄)。

grep當給定要讀取的文件名時,將不處理其標準輸入流。第一個結果在標準輸入流上grep到達。


sort -k2r LoginExcInternal.txt >test.txt

您希望Chrome第二列中的行OpenFin位於同一列中包含的行之後。上面通過以相反的字典順序對第二列上的原始數據進行排序來做到這一點。

-k2r標誌 to告訴實用程序以相反的順序 (the ) 對第二列上的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程式碼使用字元串比較,它避免輸出第二列可能包含字元串之一的行作為substring

引用自:https://unix.stackexchange.com/questions/505891