如何使用 awk 从特定列中删除空格

如何使用 awk 从特定列中删除空格

我只想修改第二列“名称”并删除名称之间的所有空格,并保持 txt 文件的其余部分不变,然后打印它。

这是我的输入(制表符分隔的字段):

Roll NO Name         RandomColumn1    RandomColumn2 
1       Jason James  my value        my val 3

我想要的输出:

Roll NO Name        RandomColumn1  RandomColumn2 
1       JasonJames  my value        my val 3

我一直在使用但不成功的命令:

 awk '{$3=$4;  print }' | sed "s/^ *//"

答案1

awk 'BEGIN{ FS=OFS="\t" }{ gsub(" ", "", $2) }1' infile

FS为输入字段分隔符; OFS是输出字段分隔符;两者都设置为制表\t符,然后我们删除(用空字符串替换)第二个字段中的所有空格字符并打印最终更新1用过的。

答案2

雇用GNU sed在其扩展正则表达式模式下,-E我们可以像所示那样进行操作。首先用\n已知在模式空间中不存在的标记 ( ) 隔开第二个字段。然后在循环中拾取这些标记之间的任何空间,并在循环后将市场恢复为字段分隔符。

sed -Ee '
  s/\t/\n/;s//\n/;ta
  :a
    s/(\n.*) (.*\n)/\1\2/
  ta
  y/\n/\t/
' file

我们可以用蟒蛇3和嵌套列表理解以获得所需的输出:

python3 -c 'import sys
ifs,ors,ifile = "\t", "\n",sys.argv[1]
spc,ofs = " ",ifs
with open(ifile) as f:
  print(*[ofs.join([f1,f2.replace(spc,""),f3_])    
for l in f for f1,f2,f3_ in [l.rstrip().split(ifs,2)]],sep=ors)
' file

perl -F'\t' -pale '
  substr($_,1+index($_,"\t$F[1]"),length($F[1])) =~ tr/ //d;
' file

答案3

命令

awk 'NR>1{$2=$2$3;$3=" "}1' filename

输出

Roll NO Name         RandomColumn1    RandomColumn2 
1       JasonJames   my value          my val 3

相关内容