Linux
用 word 對文件進行排序
我有一個看起來像這樣的文本文件
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。