2015-11-05 285 views
-1

我有一個文件,其中包含磁盤列表以及它們的序列號分隔的行。該數據是通過此格式的文件是一致的:將bash數組值賦給變量

Disk hostname disk    /proc/cds/cdd/disks/csd1 
Disk hostname disk    serial: NAGYNLGX 
Disk hostname disk    /proc/cds/cdd/disks/csd10 
Disk hostname disk    serial: NAGY85MX 

我想抓住從第一個兩行的/ proc/CDS/CDD /磁盤/ CDS1的數據,並把下一行的序列號後,在同一直線上,使得其將被格式化是這樣的:

/proc/cds/cdd/disks/csd1 NAGYNLGX 
/proc/cds/cdd/disks/cds10 NAGY85MX 

我試圖用一個陣列中的所有文件輸出到閱讀,然後用在bash腳本的值賦給變量。

#!/bin/bash 
readarray a < rec20.txt 

total=${#a[*]} 

for ((i=0; i<=$(($total -1)); i++)) 
do 
let b=i+1 
#  echo -n "${a[$i]} "|awk '{print $4}'; echo -n "${a[$b]} "|awk '{print $5}' 
#  echo -e "${a[$i]} "|awk '{print $4}'\t; echo -e "${a[$b]} "|awk '{print $5}'\n 
#  set var1= echo "${a[$i]} " |awk '{print $4}' 
#  set var2= echo "${a[$b]} " |awk '{print $5}' 
#  var1=printf '%s\t' "${a[$i]} "|awk '{print $4}' 
#  var2=printf '%s\n' "${a[$b]} "|awk '{print $5}' 
echo -e "${a[$i]} "|awk '{print $4}'\t 
echo -e "${a[$b]} "|awk '{print $5}'\n 
echo "var1 is $var1 var2 is $var2" 
let i++ 
done 
+0

殼命令是'var = value'來做到這一點,命令的輸出是'var = $(command)'。 –

回答

1

這可以很容易地使用awk來完成:

awk -v OFS='\t' 'NR%2{s=$NF; next} {print s, $NF}' rec20.txt 
/proc/cds/cdd/disks/csd1 NAGYNLGX 
/proc/cds/cdd/disks/csd10 NAGY85MX 

順便說一句正確讀取文件數據到你需要使用-t選項,也就是

readarray -t a < rec20.txt 
+1

非常感謝。這解決了它完美。 – gjskazu

+0

很高興知道它解決了[[您可以點擊答案左上角的勾號**標記答案](http://meta.stackexchange.com/a/5235/160242) – anubhava

0

在這裏,這將讀取BASH陣列文件(file.txt)並解析它你想要如何:

read -a lines <<< `cat file.txt | sed -e "s/.* //"` 

for ((i=0; i<${#lines[*]}; i+=2)); do 
    myArray+=("${lines[i]} ${lines[i+1]}") 
done 

第一行讀取文件並將其傳遞到「sed」中,該文件在最後一個空格後修剪掉所有內容。因此,該文件的內容會從您發佈到這個什麼改變:

/proc/cds/cdd/disks/csd1 
NAGYNLGX 
/proc/cds/cdd/disks/csd10 
NAGY85MX 

我當時只是通過所有的線環,和所有其他行我追加「myArray的」保持當前行和下一行放在一起。