shell分隔符引起的問題?2020 08 10

2021-10-09 01:37:16 字數 1907 閱讀 6655

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...