我正在嘗試從以下資料(Elasticsearch 資料)創建 csv 檔案
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open 78_data_store-2021.12.12 cYZDB7NGQbyowP-WyF99Zw 1 1 5438232 0 8.3gb 4.1gb
green open 78_data_store-2021.12.24 RWrhN4QKT2OlbP4MB7CYmw 1 1 663431 0 745.3mb 372.6mb
green open 78_data_store-2021.11.26 CivwBCtAROCejmpZ6RaXOA 1 1 989983 0 956.5mb 478.2mb
我想要低于輸出(預期輸出)
78,78_data_store-2021.11.26,2021.11.26,1,1,478.2mb
78,78_data_store-2021.12.12,2021.12.12,1,1,4.1gb
78,78_data_store-2021.12.24,2021.12.24,1,1,372.6mb
但是當我使用下面的命令時,我在輸出中得到了不必要的新行
cat filename | grep " 78_" | sort -k 3 | awk '{split($3,a,"_");print a[1];split($3,a,"-"); print "," $3 "," a[2] "," $5 "," $6 "," $10}'
此命令的輸出
78
,78_data_store-2021.11.26,2021.11.26,1,1,478.2mb
78
,78_data_store-2021.12.12,2021.12.12,1,1,4.1gb
78
,78_data_store-2021.12.24,2021.12.24,1,1,372.6mb
命令中缺少什么?
uj5u.com熱心網友回復:
print默認添加換行符。您可以printf("%s", a[1]);改用或將列印移動到列印a[1]所有其他欄位的位置。我已將第一次使用ainto重命名b為能夠將值保留到以后:
grep " 78_" filename | sort -k 3 | \
awk '{split($3,b,"_");split($3,a,"-"); print b[1] "," $3 "," a[2] "," $5 "," $6 "," $10}'
輸出:
78,78_data_store-2021.11.26,2021.11.26,1,1,478.2mb
78,78_data_store-2021.12.12,2021.12.12,1,1,4.1gb
78,78_data_store-2021.12.24,2021.12.24,1,1,372.6mb
uj5u.com熱心網友回復:
根據您顯示的示例,請嘗試以下awk代碼。使用Schwartzian transform在awk. 這里也使用awk sort組合awk。
awk '
BEGIN{ OFS="," }
FNR>1 && /78_/{
split($3,arr,"[_-]")
print arr[4]"@"arr[1],$3,arr[4],$5,$6,$NF
}
' Input_file |
sort -t'@' -k1 |
awk '{sub(/^[^@]*@/,"")} 1'
上述代碼說明:
- 將 Input_file(OP 的檔案)傳遞給
awk程式。 - 在此處為所有行設定
OFS為逗號。 - 檢查條件是否大于第一行并且其中包含 78_ 然后只會進一步移動。
- 使用
split函式將第三個欄位拆分為一個名為 arr 的陣列,其中分隔符位于_-此處。 - 列印
arr[4]"@"arr[1],$3,arr[4],$5,$6,$NF是根據需要的輸出,只是arr[4]@在輸出的前面額外添加了一些東西,以便我們可以輕松地對其進行排序(可以在這個程式的后面洗掉)。 awk將程式的輸出傳遞給sort命令,其中將欄位分隔符設定為@并使用第一個欄位對其進行排序(例如:所示示例中的 2021.12.12)。- 將排序后的資料傳遞給另一個
awk程式,在該程式中洗掉從值的開始到第一次出現的所有內容@(如上一步中提到的額外添加的)。
OP 嘗試的改進:
grep我們在使用時不需要使用awk,它可以自己處理搜索字串,因此將其從答案中洗掉。- 我們不需要使用 2 次
split,也可以split通過在split.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416869.html
標籤:
