Unix 从第3列打印到第n列的Awk命令
如果文件中有“n”列,如何在unix中使用awk命令从第3列打印到最后一列。我正在使用cut命令,但我需要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
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++++++