
如何使用命令列更改行?
例如我有這些行:
Acct-Status-Type = Start
User-Name = "37XXXXXXX"
Event-Timestamp = "Apr 12 2013 15:56:55 AMT"
我需要將順序更改為:
Event-Timestamp = "Apr 12 2013 15:56:55 AMT"
User-Name = "37XXXXXXX"
Acct-Status-Type = Start
我需要透過一個命令來完成此操作,sed、awk、perl 或類似的命令。
答案1
取決於您執行此操作的地點、頻率、原因等,但將其放入腳本中不會有什麼壞處。
無論如何,你可以做這樣的事情來按定義的順序列印。透過這種方法,您也可以選擇僅列印選定的幾個。例如只有 1 和 3:
一班輪:
awk -v order=312 \
'/^/{ln[NR]=$0}END{split(order,a,"");
for(i in a)printf("%s\n",ln[a[i]]);}' \
sample.txt
或更容易閱讀:
/^/{
ln[NR] = $0
}
END{
split(order,a,"");
for(i in a)
printf("%s\n",ln[a[i]]);
}
對於分割,如果超過 9 行,您可以新增一些分隔符號。
例如:
split(order,a,"-");
# and call by:
awk -v order=3-13-21-12-2 ...
或支援多個:
if (order ~ /-/) split(order, a, "-"); # order has "-", split
else if (order ~ /\./) split(order, a, "."); # order has ".", split
else if (order ~/:/) split(order, a, ":"); # order has ":", split
else split(order, a, ""); # none presume numbers split all
您也可以選擇匹配行,如下所示:
BEGIN {
i = 0;
}
/^\s*Acct-Status-Type/ {ln[++i] = $0 }
/^\s*User-Name/ {ln[++i] = $0 }
/^\s*Event-Timestamp/ {ln[++i] = $0 }
END {
if (order ~ /-/) split(order, a, "-");
else if (order ~ /\./) split(order, a, ".");
else if (order ~/:/) split(order, a, ":");
else split(order, a, "")
for (i in a)
printf("%s\n", ln[a[i]]);
}
編輯:
對於最後一個範例,這可能會更好。 (還更新了分裂):
/^\s*Acct-Status-Type/ {ln[1] = $0 }
/^\s*User-Name/ {ln[2] = $0 }
/^\s*Event-Timestamp/ {ln[3] = $0 }
END {
if (split(order, a, "-|:|,| |\\.") == 1) # Space require quoting of arg.
split(order, a, "")
for (i in a)
printf("%s\n", ln[a[i]]);
}
答案2
使用 Python 和檔案名稱作為程式的命令列參數:
import sys
with open(sys.argv[1]) as fp:
for line in fp.readlines()[::-1]:
sys.stdout.write(line)
或將其寫回該文件:
import sys
with open(sys.argv[1]) as fp:
lines = fp.readlines()
with open(sys.argv[1], 'w') as fp:
for line in lines[::-1]:
fp.write(line)
或作為從標準輸入到標準輸出的過濾器:
lines = sys.stdin.readlines()
for line in lines[::-1]:
sys.stdout.write(line)