2015-11-05 249 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的”保持当前行和下一行放在一起。