mun*_*ish 2 linux awk shell-script variable-substitution variable
输入文件:is2.txt
10.39.5.41,A1,B1
10.39.5.41,A2,B2
10.39.5.41,A3,B3
10.39.5.41,A4,B4
10.39.5.41,A5,B5
10.39.5.41,A6,B6
Run Code Online (Sandbox Code Playgroud)
脚本 :
#!/bin/bash
second_column="OOOOOOO" # OOOOOOO will be added to every second column
third_column="XXXXXXXX" # XXXXXXXX will be added to every third column
awk -v second="$second_column" -v third="$third_column" 'BEGIN { FS="," }
{
if(a[$1])
{a[$1]=a[$1]";second"$2";third"$3}
else
{a[$1]=a[$1]second$2";"third$3}}
END{for (i in a)print i";"a[i];}' < is2.txt
output:
[root@testgfs2 test]# ./testawk.awk
10.39.5.41;OOOOOOOA1;XXXXXXXXB1;secondA2;thirdB2;secondA3;thirdB3;secondA4;thirdB4;secondA5;thirdB5;secondA6;thirdB6
Run Code Online (Sandbox Code Playgroud)
为什么 shell 变量(second_column、third_column)没有反映在完整的输出中,而只反映在第一行。怎么了?
预期输出:
10.39.5.41;OOOOOOOA1;XXXXXXXXB1;OOOOOOOA2;XXXXXXXXB2;OOOOOOOA3;XXXXXXXXB3;OOOOOOOA4;XXXXXXXXB4;OOOOOOOA5;XXXXXXXXB5;OOOOOOOA6;XXXXXXXXB6
Run Code Online (Sandbox Code Playgroud)
此外,是否有任何方法可以将其概括为 n 列,比如 n = 100?
这是带有推荐间距和缩进的awk代码,你能看出问题吗?
BEGIN { FS = "," }
{
if(a[$1])
a[$1] = a[$1] ";second" $2 ";third" $3
else
a[$1] = a[$1]second $2 ";" third$3
}
END {
for (i in a)
print i ";" a[i]
}
Run Code Online (Sandbox Code Playgroud)
你在条款中引用了second
和。third
if
从您的预期输出猜测,您可以这样做:
awk -v c2='OOOOOOO' -v c3='XXXXXXXX' -v FS=, -v OFS=';' -v ORS=';' '
!f {
printf "%s", $1
f=1
}
{
$1 = ""
$2 = c2 $2
$3 = c3 $3
}
1
' | sed 's/;;/;/g; s/;$//'
Run Code Online (Sandbox Code Playgroud)
输出:
10.39.5.41;OOOOOOOA1;XXXXXXXXB1;OOOOOOOA2;XXXXXXXXB2;OOOOOOOA3;XXXXXXXXB3;OOOOOOOA4;XXXXXXXXB4;OOOOOOOA5;XXXXXXXXB5;OOOOOOOA6;XXXXXXXXB6
Run Code Online (Sandbox Code Playgroud)
为了概括这种方法,您可以传入位以预先添加一个字符串并将其拆分为一个 awk 数组。然后使用 for 循环而不是显式列变量:
awk -v prepends='OOOOOOO XXXXXXXX' -v FS=, -v OFS=';' -v ORS=';' '
BEGIN { split(prepends, cn, / +/) }
!f {
printf "%s", $1
f=1
}
{
$1 = ""
for(i=1; i<=NF; i++)
$i = cn[i-1] $i
}
1' | sed 's/;;/;/g; s/;$//'
Run Code Online (Sandbox Code Playgroud)