shell分隔符引起的問題?
—20200810
在linux環境中使用shell指令碼處理資料,從data.csv檔案中讀取多個機房裝置的ip,並將資料彙總。
原始資料:
data.csv
機房名 裝置名 ip
機房1 機器1 192.168.1.2
機房1 機器2 192.168.1.3
機房2 機器3 192.168.2.2
機房2 機器4 192.168.2.3
機房2 機器5 192.168.2.4
期望的結果為:
機房名 裝置名 ip
機房1 機器1 192.168.1.2;192.168.1.3
機房2 機器3 192.168.2.2;192.168.2.3;192.168.2.4
方法1:
for i in
$(cat data.csv |
cut -d, -f 1 |
sort -u);do
ips=
$(grep $i data.csv |
cut -d, -f 3)
ipj=
""for ip in
$ips;do
ipj=
"$;$"
done
echo
$i,$ipj
>> name_ip.csv
done
但該方法生成的結果卻為:
機房1 機器1 ;192.168.1.2; 192.168.1.3
機房2 機器3 ;192.168.2.2; 192.168.2.3; 192.168.2.4
因為當$為空時,不需要加「;」號。
改進1:(缺點,多了2層圈複雜度)
for i in
$(cat data.csv |
cut -d, -f 1 |
sort -u);do
ips=
$(grep $i data.csv |
cut -d, -f 3)
ipj=
""for ip in
$ips;do
if[!$
];then
ipj=
"$"else
ipj=
"$;$"
fidone
echo
$i,$ipj
>> name_ip.csv
done
嘗試通過下標處理,第乙個ip前面不加分號;:
#!/bin/bash
for i in
$(cat data.csv |
cut -d, -f 1 |
sort -u);do
ips=
$(grep $i data.csv |
cut -d, -f 3)
ipj=
""ipj=
"$"for
((j=
1;j<$;j++
))do
ipj=
"$;$"
done
echo
$i,$ipj
>> name_ip.csv
done
結果並非預期,因為ips陣列的分割符並非空格,而是回車換行符。出現
$值恒為1的情況。
除錯半天,才發現錯誤所在,記錄一下,後面要避免掉坑。
二、基礎命令
1、檢視裝置晶元架構是x86或arm
uname -a
2、檢視ip位址
ifconfig
3、檢視裝置名稱:
dmidecode | grep 「product name」
4、ping ip位址
5、tracepath ip位址
sqoop export 分隔符問題
sqoop 匯出如果分隔符指定的不對會導致hive 進sqoop 資料不能正確的分隔,會造成匯出任務失敗。在使用hive的時候,分隔符是必不可少的,當學習的時候使用的都是常規分隔符,比如 逗號 豎線 等,這些鍵盤上都可以直接輸入的字元,但是這些字元只要是鍵盤上的,在針對複雜的業務邏輯的時候,都會失效...
自定義Shell分隔符
在shell中使用for迴圈語句時,引數列表有時候需要將空格納入引數當中,這時就不好使用空格作為分隔符。如下例中,我實際想要輸出的是a1 a2 b1 b2以及hello world,但卻輸出了如下內容 root youxi1 vim a.sh bin bash list a1 a2 b1 b2 he...
Hive的列分隔符和行分隔符
在建立hive表時,預設行分隔符 a 列分隔符 n 這兩項也是可以設定的。在實際開發中,一般預設使用預設的分隔符,當然有些場景下也會自定義分隔符。spark hive use test db 建立外部表 create external table test tb user id bigint com...