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 个空格”,我相信您认为它是这个意思。
我正在尝试使用此命令从我的文件第二列末尾删除 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 个空格”,我相信您认为它是这个意思。