awk 从列的末尾删除一些空格

awk Removing some spaces from the end of a column

我正在尝试使用此命令从我的文件第二列末尾删除 2 个空格:

awk '{gsub(/[ $]/, "", ); print}' Myfile

我的输入文件的格式是这样的(这里的字符和数字只是为了显示格式):

   1AA       A      1   9.999   9.999   9.999
 111BB       B   1111   9.999   9.999   9.999
1111AABB  ABCD  11111   9.999   9.999   9.999

我想要如下输出:

   1AA       A    1   9.999   9.999   9.999
 111BB       B 1111   9.999   9.999   9.999
1111AABB  ABCD11111   9.999   9.999   9.999

实际上,第三列向第二列移动了 2 个空格。

但我的代码什么也没做:(

任何人都可以向我解释我的代码有什么问题吗?

提前致谢!

此处,在 awk gsub 中,[ $] 模式匹配两个字符之一:space 或 $ 字符,并且等于 [$ ] .

因为你的文件是 fixed-width,你可以使用像

这样的 GNU awk 命令
awk 'BEGIN { FIELDWIDTHS="10 6 8 8 8 8" } {gsub(/  $/,"",); print      }' Myfile > newMyfile

其中 / $/ 匹配输入末尾的两个文字 space($ 定义字符串的末尾)。

"4.6.1 Processing Fixed-Width Data" gawk manual 中查看有关 FIELDWIDTHS 的更多信息。

使用您显示的示例,请尝试以下 rev + awk + rev 组合代码。在 GNU awk.

中编写和测试
rev Input_file | 
awk '
  match([=10=],/^\S+(\s+\S+){3}/){
    val1=substr([=10=],RSTART,RLENGTH)
    val2=substr([=10=],RSTART+RLENGTH)
    sub(/^  /,"",val2)
    [=10=]=val1 val2
  }
1
' | rev

使用所示示例,输出如下:

   1AA       A    1   9.999   9.999   9.999
 111BB       B 1111   9.999   9.999   9.999
1111AABB  ABCD11111   9.999   9.999   9.999

解释:下面是对以上代码的详细层次解释。

rev Input_file |                    ##using rev on Input_file to get output in reverse order.
awk '                               ##Sending rev output as standard input to awk.
  match([=12=],/^\S+(\s+\S+){3}/){      ##using match function of awk to match regex ^\S+(\s+\S+){3}
    val1=substr([=12=],RSTART,RLENGTH)  ##Creating val1 variable which has matched values in it.
    val2=substr([=12=],RSTART+RLENGTH)  ##Creating val2 variable which has rest of values(after matched value).
    sub(/^  /,"",val2)              ##Substituting starting 2 spaces(which are actually 2 spaces we need to remove between 2nd and 3rd field in question) with NULL in val2 here.
    [=12=]=val1 val2                    ##Assigning val1 and val2 values to current line.
  }
1                                   ##printing current line here.
' | rev                             ##Sending awk program output to rev to print values in actual order.

在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ awk '{print substr([=10=],1,14) substr([=10=],17)}' file
   1AA       A    1   9.999   9.999   9.999
 111BB       B 1111   9.999   9.999   9.999
1111AABB  ABCD11111   9.999   9.999   9.999

或使用 GNU awk 表示 FIELDWIDTHS(如果你有一个不理解 * 的旧 gawk 版本,请使用 9999 或其他一些大数字而不是 * 的含义“该行的其余部分"):

$ awk -v FIELDWIDTHS='14 2 *' '{print  }' file
   1AA       A    1   9.999   9.999   9.999
 111BB       B 1111   9.999   9.999   9.999
1111AABB  ABCD11111   9.999   9.999   9.999

您的代码的问题是您试图从 $2 中删除 2 个空格,但您的字段是 space-separated 因此任何字段中都没有空格,包括 $2,空格位于字段之间。另外,您的正则表达式 /[ $]/ 表示“空白或文字 $ char”,而不是“字符串末尾前的 2 个空格”,我相信您认为它是这个意思。