Tôi tò mò muốn xem một số trong số này (+ một số lựa chọn thay thế) hoạt động nhanh như thế nào với một tệp khá lớn ( 163MiB
, IP
mỗi tệp trên một dòng, ~ 13 triệu dòng):
wc -l < iplist
13144256
Kết quả (với sync; echo 3 > /proc/sys/vm/drop_caches
sau mỗi lệnh; tôi lặp lại các thử nghiệm - theo thứ tự ngược lại - sau một vài giờ nhưng sự khác biệt là không đáng kể; cũng lưu ý rằng tôi đang sử dụng gnu sed
):
Người thép :
Rất chậm. Bị hủy bỏ sau hai phút chờ đợi ... vì vậy không có kết quả nào cho việc này.
cuonglm :
awk 'FNR!=1{print l}{l=$0};END{ORS="";print l}' ORS=' | ' iplist
real 0m3.672s
perl -pe 's/\n/ | / unless eof' iplist
real 0m12.444s
mikeerv :
paste -d\ /dev/null iplist /dev/null | paste -sd\| -
real 0m0.983s
tháng năm :
sed 'H;1h;$!d;x;s/\n/ | /g' iplist
real 0m4.903s
Avinash Raj :
time python2.7 -c'
import sys
with open(sys.argv[1]) as f:
print " | ".join(line.strip() for line in f)' iplist
real 0m3.434s
và
val0x00ff :
while read -r ip; do printf '%s | ' "$ip"; done < iplist
real 3m4.321s
mà phương tiện 184.321s
. Không có gì đáng ngạc nhiên, điều này chậm hơn 200 lần so với giải pháp của mikeerv .
Đây là một số cách khác với
awk:
awk '$1=$1' RS= OFS=' | ' iplist
real 0m4.543s
awk '{printf "%s%s",sep,$0,sep=" | "} END {print ""}' iplist
real 0m5.511s
perl:
perl -ple '$\=eof()?"\n":" | "' iplist
real 0m9.646s
xargs:
xargs <iplist printf ' | %s' | cut -c4-
real 0m6.326s
sự kết hợp của đầu + dán + tr + mèo:
{ head -n -1 | paste -d' |' - /dev/null /dev/null | tr \\n \ ; cat ; } <iplist
real 0m0.991s
Nếu bạn có GNU coreutils
và nếu danh sách IP của bạn không thực sự lớn (giả sử lên tới 50000 IP), bạn cũng có thể làm điều này với pr
:
pr -$(wc -l infile) -tJS' | ' -W1000000 infile >outfile
Ở đâu
-$(wc -l infile) # no. of columns (= with no. of lines in your file)
-t # omit page headers and trailers
-J # merge lines
-S' | ' # separate columns by STRING
-W1000000 # set page width
ví dụ: đối với tệp 6 dòng:
134.28.128.0
111.245.28.0
109.245.24.0
128.27.88.0
122.245.48.0
103.44.204.0
lệnh:
pr -$(wc -l <infile) -tJS' | ' -W1000 infile
đầu ra:
134.28.128.0 | 111.245.28.0 | 109.245.24.0 | 128.27.88.0 | 122.245.48.0 | 103.44.204.0
tr
xiên dòng mới vào|
đường ống? Giống như<ipfile tr \\n \| >outfile
?