AWK - 列的打印范围

nat*_*ath 5 awk text-processing csv text-formatting

如果我有以下格式的 csv 文件:

column1,column2,column3,column4,column5,column6,column7,column8
Run Code Online (Sandbox Code Playgroud)

我只想awk打印第 2 列到第 7 列,我会使用:

awk -F',' '{print $2 "," $3 "," $4 "," $5 "," $6 "," $7}' file.csv
Run Code Online (Sandbox Code Playgroud)

并得到:

column2,column3,column4,column5,column6,column7
Run Code Online (Sandbox Code Playgroud)

有没有办法连接第 2-7 列以简化命令。当我想到一个包含更多列的文件时,我的awk命令会变得非常长。

drl*_*drl 14

效用切割有一个紧凑的符号:

cut -d, -f2-7 <input-file>
Run Code Online (Sandbox Code Playgroud)

生产:

第2列、第3列、第4列、第5列、第6列、第7列

回答@PlasmaBinturong 的评论:我的意图是解决短调用序列的问题:“......我的 awk 命令会变得非常长......”。然而,人们也可以找到根据需要排列字段的代码。尽管我喜欢 awk、perl、python,但我经常发现构建一个特定的实用程序来扩展标准 *nix 的功能很有用。因此,这里是测试脚本 s2 的摘录,显示了实用程序重新剪切和排列,两者都允许重新排列和复制,排列还允许减小字段范围:

FILE=${1-data1}

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input data file $FILE:"
head $FILE

pl " Results, cut:"
cut -d, -f2-7 $FILE

pl " Results, recut (modified as my-recut):"
my-recut -d "," 7,6,2-5 < $FILE

pl " Results, arrange:"
arrange -s "," -f 5,3-1,7,5,3-4,5 $FILE
Run Code Online (Sandbox Code Playgroud)

从这些版本产生结果:

OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
bash GNU bash 4.3.30
cut (GNU coreutils) 8.23
recut - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 )
arrange (local) 1.15

-----
 Input data file data1:
column1,column2,column3,column4,column5,column6,column7,column8

-----
 Results, cut:
column2,column3,column4,column5,column6,column7

-----
 Results, recut (modified as my-recut):
column7,column6,column2,column3,column4,column5

-----
 Results, arrange:
column5,column3,column2,column1,column7,column5,column3,column4,column5
Run Code Online (Sandbox Code Playgroud)

my-recut 是对 textutils 代码 recut 的轻微修改,arrange 是我们的扩展版本。更多信息:

recut   Process fields like cut, allow repetitions and re-ordering. (what)
Path    : ~/bin/recut
Version : - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 )
Length  : 56 lines
Type    : Perl script, ASCII text executable
Shebang : #!/usr/bin/perl
Home    : http://www1.cuni.cz/~obo/textutils/ (doc)
Modules : (for perl codes)
 Getopt::Long   2.42

arrange Arrange fields, like cut, but in user-specified order. (what)
Path    : ~/bin/arrange
Version : 1.15
Length  : 355 lines
Type    : Perl script, ASCII text executable
Shebang : #!/usr/bin/perl
Modules : (for perl codes)
 warnings       1.23
 strict 1.08
 Carp   1.3301
 Getopt::Euclid 0.4.5
Run Code Online (Sandbox Code Playgroud)

最好的祝福......干杯,博士


Ed *_*ton 6

$ awk -v b=2 -v e=7 'BEGIN{FS=OFS=","} {for (i=b;i<=e;i++) printf "%s%s", $i, (i<e ? OFS : ORS)}' file
column2,column3,column4,column5,column6,column7
Run Code Online (Sandbox Code Playgroud)

b=开始字段编号,e=结束字段编号。如果您需要使用带引号的字段、嵌入的逗号、换行符等处理 CSV,请参阅/sf/ask/3179437481/