如何在UNIX中使用awk命令打印第3列到最后一列,如果文件中有'n'列。我正在使用cut命令,但我需要awk命令。我正在尝试与awk -F " " '{ for{i=3;i<=NF;i++) print $i}'
,我得到的输出,但它不是在正确的格式。任何人都可以建议我适当的命令。awk命令从第3列打印到第n列
回答
你试图接近,但看来,它会在新行打印每列。 要纠正这个问题,我们创建一个名为'line'的变量并将其初始化为一个空字符串。我们第一次进入循环时,我们只需将该列添加到“行”中。从这一点开始,我们将添加字段分隔符和下一列。最后,我们打印'行'。这将发生在文件中的每一行。
awk '{line="";for(i=3;i<=NF;i++) if(i==3) line=$i; else line=line FS $i; print line}'
在这个例子中,我假设使用awk的默认字段分隔符。任何小于三的行都会打印空行。
非常感谢Wayne。它非常好 – Srinivas
在结合埃德莫顿的答案:
我们得到了这样的事:
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
我们只是打印第3列:
$ awk '{sub(/^(\S+\s*){2}/,""); sub(/(\s*\S+){2}$/,"")}1' <(paste -d ' ' <(seq 5) <(seq 2 6) <(seq 3 7) <(seq 4 8) <(seq 5 9))
3
4
5
6
7
如果你不介意正火的空间,最直接的方法是
$ 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然后gensub():
$ cat file
a b c d e f
g h i j k l
$ awk '{print gensub(/(\S\s){2}/,"",1)}' file
c d e f
i j k l
一般来说到,比如说,从字段3打印到字段5如果使用GNU awk将它们用空白分隔,再用gensub():
$ awk '{print gensub(/(\S\s){2}((\S\s){2}\S).*/,"\\2",1)}' file
c d e
i j k
或第三个arg匹配():
$ awk 'match($0,/(\S\s){2}((\S\s){2}\S)/,a){print a[2]}' file
c d e
i j k
或一般的,如果它们是由任何单个字符分隔:
$ 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(其通过定义你知道可以不存在于记录),因此可以在括号表达式否定它所:
$ 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是多声道AR则有不同的选择,但最简单的就是用你知道能不能出现在你的输入文件,而不是RS作为临时更换FS的NULL字符或其它字符:
$ 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
明显变化FS到OFS中如果需要的话,最后的gsub()会被提供。
如果FS是一个正则表达式,而不是一个字符串,并要保留它的输出,那么你需要看看GNU AWK第四届ARG的分裂()。
精湛! ++++++ – fedorqui
为了从第三塔打印到直到端然后 猫文件名| AWK '{对于(I = 1;我< 3; i ++在)$ I = “”;打印$ 0}'
- 1. 如何使用awk打印每第4列至第n列和从第(n + 1)列到最后一列?
- 2. AWK命令从文件1更换第n个领域在第n行到file2
- 3. AWK:打印一切,但不是最后的第n列
- 4. awk命令拆分第n个字段
- 5. 如何从awk中的第(n + 3)行减去第n个?
- 6. 从文件打印n列到n列
- 7. 打印第二个命令行参数
- 8. 如何使用awk打印每第n个匹配
- 9. Awk打印行如果第5列包含句点
- 10. 如果在CSV的第n列中模式不匹配,awk插入第n行
- 11. awk简单的制表符分隔为1到第n列
- 12. awk命令使用for循环打印多列
- 13. 在第N阵列
- 14. 打印第一列匹配的行,第二列不同
- 15. 我想使用awk打印重新排列的字段,然后从第4字段打印到末尾
- 16. R:第(n + 1)行第n行第m + 1列与第(n + 1)行第m列之间的日期差
- 17. sed&awk,第二列修改
- 18. awk来从非现有的第一列
- 19. AWK打印行基于列
- 20. 用Awk或Cut打印列?
- 21. AWK和打印命令输出
- 22. SQL函数:使用第1列和第2列给第3列
- 23. 命令打印所有行,直到第一次匹配
- 24. 如何打印第三列到最后一列?
- 25. 接入子排列/打印第n个元素,每一个阵列
- 26. 从第n列到行尾使用行值的列表
- 27. 最后第n行grep命令
- 28. Awk - 返回列中第n个字开头的模式
- 29. 如何使用awk为每个第n行添加一列?
- 30. 尝试使用awk打印列但打印未找到
你能得到样品输入/ output ...是否定义了列空间? – zee
'cut'有什么问题? –