Unix 从第3列打印到第n列的Awk命令

Unix 从第3列打印到第n列的Awk命令,unix,awk,Unix,Awk,如果文件中有“n”列,如何在unix中使用awk命令从第3列打印到最后一列。我正在使用cut命令,但我需要awk命令。我试图用awk-F”“{for{I=3;I结合Ed Morton的答案: 我们得到这样的结果: awk '{sub(/^(\S+\s*){2}/,""); sub(/(\s*\S+){2}$/,"")}1' # ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ # remove 2 first cols

如果文件中有“n”列,如何在unix中使用awk命令从第3列打印到最后一列。我正在使用cut命令,但我需要awk命令。我试图用
awk-F”“{for{I=3;I结合Ed Morton的答案:

我们得到这样的结果:

awk '{sub(/^(\S+\s*){2}/,""); sub(/(\s*\S+){2}$/,"")}1'
#     ^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^
#     remove 2 first cols      remove 2 last cols
您可以根据您的具体需求调整列

请参阅给定此输入的示例:

$ paste -d ' ' <(seq 5) <(seq 2 6) <(seq 3 7) <(seq 4 8) <(seq 5 9) 
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9

$paste-d'将Ed Morton的答案组合在:

我们得到这样的结果:

awk '{sub(/^(\S+\s*){2}/,""); sub(/(\s*\S+){2}$/,"")}1'
#     ^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^
#     remove 2 first cols      remove 2 last cols
您可以根据您的具体需求调整列

请参阅给定此输入的示例:

$ paste -d ' ' <(seq 5) <(seq 2 6) <(seq 3 7) <(seq 4 8) <(seq 5 9) 
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9

$paste-d'如果您不介意规范化空间,最简单的方法是

$ awk '{$1=$2=""}1' | sed -r 's/^ +//'
行动中

$ seq 11 40 | pr -6ts' ' | awk '{$1=$2=""}1' | sed -r 's/^ +//'

21 26 31 36
22 27 32 37
23 28 33 38
24 29 34 39
25 30 35 40
输入

$ seq 11 40 | pr -6ts' '

11 16 21 26 31 36
12 17 22 27 32 37
13 18 23 28 33 38
14 19 24 29 34 39
15 20 25 30 35 40

如果您不介意规范化空间,最直接的方法是

$ awk '{$1=$2=""}1' | sed -r 's/^ +//'
行动中

$ seq 11 40 | pr -6ts' ' | awk '{$1=$2=""}1' | sed -r 's/^ +//'

21 26 31 36
22 27 32 37
23 28 33 38
24 29 34 39
25 30 35 40
输入

$ seq 11 40 | pr -6ts' '

11 16 21 26 31 36
12 17 22 27 32 37
13 18 23 28 33 38
14 19 24 29 34 39
15 20 25 30 35 40

假设您的字段是空格分隔的,那么使用GNU awk for gensub():

通常情况下,如果使用GNU awk再次使用GESUB()将字段3打印到字段5,请执行以下操作:

或要匹配的第三个参数()

或者通常,如果它们由任何单个字符分隔:

$ awk '{print gensub("([^"FS"]"FS"){2}(([^"FS"]"FS"){2}[^"FS"]).*","\\2",1)}' file
c d e
i j k

$ awk 'match($0,"([^"FS"]"FS"){2}(([^"FS"]"FS"){2}[^"FS"])",a){print a[2]}' file
c d e
i j k
如果字段由字符串而不是单个字符分隔,但RS是单个字符,则应临时将FS更改为RS(根据定义,您知道记录中不存在RS),以便在括号表达式中对其求反:

$ cat file
aSOMESTRINGbSOMESTRINGcSOMESTRINGdSOMESTRINGeSOMESTRINGf
gSOMESTRINGhSOMESTRINGiSOMESTRINGjSOMESTRINGkSOMESTRINGl

$ awk -F'SOMESTRING' '{gsub(FS,RS)} match($0,"([^"RS"]"RS"){2}(([^"RS"]"RS"){2}[^"RS"])",a){gsub(RS,FS,a[2]); print a[2]}' file
cSOMESTRINGdSOMESTRINGe
iSOMESTRINGjSOMESTRINGk
如果FS和RS都是多字符,则有多种选择,但最简单的方法是使用NUL字符或其他一些您知道不能出现在输入文件中的字符代替RS作为临时替换FS:

$ awk -F'SOMESTRING' '{gsub(FS,"\0")} match($0,/([^\0]\0){2}(([^\0]\0){2}[^\0])/,a){gsub("\0",FS,a[2]); print a[2]}' file
cSOMESTRINGdSOMESTRINGe
iSOMESTRINGjSOMESTRINGk
显然,如果需要,可以在上面的最后一个gsub()s中将FS更改为OFS


如果FS是一个regexp而不是一个字符串,并且您希望将其保留在输出中,那么您需要查看GNU awk以获得split()的第四个参数。

假设您的字段是空格分隔的,然后使用GNU awk获得gensub()

通常情况下,如果使用GNU awk再次使用GESUB()将字段3打印到字段5,请执行以下操作:

或要匹配的第三个参数()

或者通常,如果它们由任何单个字符分隔:

$ awk '{print gensub("([^"FS"]"FS"){2}(([^"FS"]"FS"){2}[^"FS"]).*","\\2",1)}' file
c d e
i j k

$ awk 'match($0,"([^"FS"]"FS"){2}(([^"FS"]"FS"){2}[^"FS"])",a){print a[2]}' file
c d e
i j k
如果字段由字符串而不是单个字符分隔,但RS是单个字符,则应临时将FS更改为RS(根据定义,您知道记录中不存在RS),以便在括号表达式中对其求反:

$ cat file
aSOMESTRINGbSOMESTRINGcSOMESTRINGdSOMESTRINGeSOMESTRINGf
gSOMESTRINGhSOMESTRINGiSOMESTRINGjSOMESTRINGkSOMESTRINGl

$ awk -F'SOMESTRING' '{gsub(FS,RS)} match($0,"([^"RS"]"RS"){2}(([^"RS"]"RS"){2}[^"RS"])",a){gsub(RS,FS,a[2]); print a[2]}' file
cSOMESTRINGdSOMESTRINGe
iSOMESTRINGjSOMESTRINGk
如果FS和RS都是多字符,则有多种选择,但最简单的方法是使用NUL字符或其他一些您知道不能出现在输入文件中的字符代替RS作为临时替换FS:

$ awk -F'SOMESTRING' '{gsub(FS,"\0")} match($0,/([^\0]\0){2}(([^\0]\0){2}[^\0])/,a){gsub("\0",FS,a[2]); print a[2]}' file
cSOMESTRINGdSOMESTRINGe
iSOMESTRINGjSOMESTRINGk
显然,如果需要,可以在上面的最后一个gsub()s中将FS更改为OFS


如果FS是一个regexp而不是一个字符串,并且您希望将其保留在输出中,那么您需要查看GNU awk以获得split()的第四个参数。

您的尝试已接近尾声,但似乎它将在新行上打印每一列。 为了纠正这一点,我们创建了一个名为“line”的变量,并将其初始化为空字符串。第一次进入循环时,我们只需将列添加到“line”。从那时起,我们将使用字段分隔符和下一列附加到“line”。最后,我们打印“line”。这将发生在文件中的每一行

awk '{line="";for(i=3;i<=NF;i++) if(i==3) line=$i; else line=line FS $i; print line}'

awk'{line=”“;for(i=3;i您的尝试接近成功,但似乎会将每一列打印到新行上。
为了纠正这一点,我们创建了一个名为“line”的变量,并将其初始化为空字符串。第一次进入循环时,我们只需将列添加到“line”。从那时起,我们将使用字段分隔符和下一列附加到“line”。最后,我们打印“line”。这将发生在文件中的每一行

awk '{line="";for(i=3;i<=NF;i++) if(i==3) line=$i; else line=line FS $i; print line}'

awk'{line=”“;用于(i=3;i从第三列打印到最后

cat文件名| awk'{用于(i=1;i从第三列打印到最后
cat filename | awk'{for(i=1;i你能给样本输入/输出…列空间被划分了吗?
cut
有什么问题吗?你能给样本输入/输出…列空间被划分了吗?
cut
有什么问题吗?@karakfa它不太通用:)@karakfa它不太通用:)太棒了!!+++supery++++++