我如何使用awk加入各个领域,因为我不知道他们有多少?例如,给定输入字符串
aaa/bbb/ccc/ddd/eee
我使用-F'/'
作为分隔符,对aaa
,bbb
,ccc
,ddd
,eee
进行一些操作(更改,删除) ...)我想加入它以打印出一些行
AAA/bbb/ddd/e
由于
答案 0 :(得分:9)
......鉴于我不知道他们中有多少人?
啊,但你做知道你有多少(a)。 NF
是包含当前记录中字段数的变量,您可以使用for
循环来处理它们:
$ echo pax/is/a/love/god | awk -F/ '{
gsub (/god/,"dog",$5);
$4 = "";
$6 = $5;
$5 = "rabid";
printf $1;
for (i = 2; i <= NF; i++) {
if ($i != "") {
printf "."$i };
}
}
printf "\n";
}'
pax.is.a.rabid.dog
这显示了对值的操纵,以及插入和删除。
(a)嗯,你很快,继续阅读。
答案 1 :(得分:1)
以下内容将向您展示如何处理每个字段并对它们进行一些示例操作。
使用输出字段分隔符OFS
的唯一警告是“已删除”字段仍将具有分隔符,如下面的输出所示;但是,如果你可以接受它,它会使代码更简单。
awk '
BEGIN{FS=OFS="/"}
{
for(i=1;i<=NF;i++){
if($i == "aaa")
$i=toupper($i)
else if($i ~ /c/)
$i=""
else if($i ~ /^eee$/)
$i="e"
}
}1' <<<'aaa/bbb/ccc/ddd/eee'
AAA/bbb//ddd/e
答案 2 :(得分:0)
awk -F'/' '{ # I'd suggest to add them to an array, like:
# for (i=1;i<=NF;i++) {a[i]=$i }
# Now manipulate your elements in the array
# then finally print them:
n = asorti(a, dest)
for (i=1;i<=n;i++) { output+=dest[i] "/") }
print gensub("/$","","g",output)
}' INPUTFILE
这样做也可以删除元素。 注意删除项目可以像delete array[index]
一样完成。
答案 3 :(得分:0)
这可能对您有用:
echo "aaa/bbb/ccc/ddd/eee" |
awk 'BEGIN{FS=OFS="/"}{sub(/../,"",$4);NF=4;print}'
aaa/bbb/ccc/d
要删除不在最后的字段,请使用一个函数来重排值:
echo "aaa/bbb/ccc/ddd/eee" |
awk 'func d(n){for(x=n;x<=NF-1;x++){y=x+1;$x=$y}NF--};BEGIN{FS=OFS="/"}{d(2);print}'
aaa/ccc/ddd/eee
删除第二个字段。