![循环遍历数组](https://linux22.com/image/55151/%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E6%95%B0%E7%BB%84.png)
list.txt
我在(INPUT)中的记录为
List of animals SET 1=Dog 2=Crow 3=Snake Pet,bird,reptile
List of Countries SET 1=France 2=Singapore 3=Columbia Europe,Asia,SouthAmerica
List of Parts SET 1=KeyBoard 2=Speaker 3=LEDpanel Computer,AudioPlayer,Television
List of Cities SET 1=Amsterdam 2=KualLumpur 3=Paris Netherlands,Malaysia,France
想要将每行的最后一列用作数组来替换数字 1,2,3 例如。使用Pet,bird,reptile
第一行来制作Pet=Dog
bird=Crow
和reptile=Snake
。
所以,输出文件将是
List of animals SET Pet=Dog bird=Crow reptile=Snake
List of Countries SET Europe=France Asia=Singapore SouthAmerica=Columbia
List of Parts SET Computer=KeyBoard AudioPlayer=Speaker Television=LEDpanel
List of Cities SET Netherlands=Amsterdam Malaysia=KualLumpur France=Paris
使用awk
,我可以将最后一列拆分为数组字符串。但无法用同样的数字来代替1、2、3。
答案1
a
您可以使用语法循环 awk 数组中的项目for (i in a)
。例如你可以做类似的事情
awk '{split($NF,a,","); $NF=""; for (i in a) sub(i"=",a[i]"=",$0); print}' list.txt
答案2
如果总是有 3 个项目 ( x=y
) 并且行中没有空格,则此awk
语句应该有效:
awk -F',| |=' '{printf "%s %s %s %s %s=%s %s=%s %s=%s\n", \
$1, $2, $3, $4, $11, $6, $12, $8, $13, $10}' list.txt
解释:
-F',| |='
:将字段分隔符设置为,
、 空格 和=
'{printf ...
以所需的格式打印值list.txt
输入文件
答案3
该脚本应该适用于任意数量的连续项目。
while read line do valType=($(echo $line | awk '{ print $NF }' | tr ',' ' ')) vals=($(echo $line | awk '{ $NF="";$1="";$2="";$3="";$4=""; print $0 }' | tr [1234567890] ' ' | tr '=' ' ' )) echo $line | awk '{print $1" "$2" "$3" "$4 }' | tr -d '\n' numVals=${#vals[@]} for i in $(seq 0 $((numVals-1))) do echo -n " "${valType[$i]}"="${vals[$i]} done echo " " done < list.txt
解释:
valType
包含逗号分隔元素的数组。
vals
包含行中第四个位置和最后一个位置之间的关联值,删除了数字和等号。
循环遍历数组中的值的数量,可以引用两个数组中的匹配值。
答案4
set '.\(=.[^ ]*\) ' '\([^,]*\),'
sed "s/\$/,/;s/$1$1$1$2$2$2/\4\1 \5\2 \6\3/
" <<\DATA
List of animals SET 1=Dog 2=Crow 3=Snake Pet,bird,reptile
List of Countries SET 1=France 2=Singapore 3=Columbia Europe,Asia,SouthAmerica
List of Parts SET 1=KeyBoard 2=Speaker 3=LEDpanel Computer,AudioPlayer,Television
List of Cities SET 1=Amsterdam 2=KualLumpur 3=Paris Netherlands,Malaysia,France
DATA
它使用 shell 数组来设置您的数组。
输出
List of animals SET Pet=Dog bird=Crow reptile=Snake
List of Countries SET Europe=France Asia=Singapore SouthAmerica=Columbia
List of Parts SET Computer=KeyBoard AudioPlayer=Speaker Television=LEDpanel
List of Cities SET Netherlands=Amsterdam Malaysia=KualLumpur France=Paris