我要字段1,2,3,5
我用刀子做:
cut -f1-3,5然而,对于awk,我会这样做:
awk '{for (i=0;i<=5;i++) {if (i!=4) {print $i}} }'但我想让它更简洁。此外,在其他情况下,我可以有更多的不同距离的字段。awk '{for (i in 1 2 3 5) {print $i}}'不工作。我该怎么做?
发布于 2022-09-28 20:55:54
这做了cut所做的事情,而且做得更多:
$ echo 'a b c d e f g' |
awk -v ranges='1-3,5' '
BEGIN {
split(ranges,r,/,/)
for ( i=1; i in r; i++ ) {
n = split(r[i],range,/-/)
for ( j=range[1]; j<=range[n]; j++ ) {
f[++onf] = j
}
}
}
{
for ( i=1; i<=onf; i++ ) {
printf "%s%s", $(f[i]), (i<onf ? OFS : ORS)
}
}
'
a b c e上述假设假设,如果您多次指定相同的字段号,那么需要多次打印该字段,并且希望按指定的顺序打印字段,以便例如重新排列顺序和/或重复字段,例如:
$ echo 'a b c d e f g' |
awk -v ranges='6,1-3,5,2,1' '
BEGIN {
split(ranges,r,/,/)
for ( i=1; i in r; i++ ) {
n = split(r[i],range,/-/)
for ( j=range[1]; j<=range[n]; j++ ) {
f[++onf] = j
}
}
}
{
for ( i=1; i<=onf; i++ ) {
printf "%s%s", $(f[i]), (i<onf ? OFS : ORS)
}
}
'
f a b c e b a发布于 2022-09-28 18:44:23
对于按位置、数量和字段范围等进行字段选择的工作,cut做得更好。如果您真的想在awk中模仿这种行为,前提是您还需要在awk中完成其他任务,那么您可以考虑使用以下代码:
cat fcut.awk
BEGIN {
n = split(f, a, /,/)
for (i=1; i<=n; ++i) {
if (split(a[i], b, /-/) == 2) {
for (j=b[1]; j<=b[2]; ++j)
fld[j]
}
else
fld[a[i]]
}
}
{
for (i=1; i<=NF; ++i) {
if (i in fld)
s = (st++ ? s OFS : "") $i
}
print s
s = st = ""
}现在将其运行为:
awk -v f='1-3,5' -f fcut.awk filehttps://stackoverflow.com/questions/73886011
复制相似问题