Linux 如何使用awk打印选定的连续和随机列

Linux 如何使用awk打印选定的连续和随机列,linux,unix,awk,Linux,Unix,Awk,我想从ifile.txt打印第1到第10列、第23列和第27列。我可以使用 awk '{n=10; for (i=1;i<=n;i++) printf "%f ", $i; print "";}' ifile.txt 当我使用下面的 #!/bin/bash awk '{ n=10 for (i=1; i<=n; i++) a[$i] a[$23] a[$27] for (k in a) printf "%5.1f", k, FS print "" }' ifile.

我想从ifile.txt打印第1到第10列、第23列和第27列。我可以使用

awk '{n=10; for (i=1;i<=n;i++) printf "%f ", $i; print "";}' ifile.txt
当我使用下面的

#!/bin/bash
awk '{
n=10
for (i=1; i<=n; i++)
    a[$i]
a[$23]
a[$27]
for (k in a)
    printf "%5.1f", k, FS
print ""
}' ifile.txt
当我使用

cut -d ' ' -f1-10,23,27 ifile.txt
它给

1 2 3 4 5 6 7 8 9 22 26
1 2 3 4 5 6 7 8 9 22 26
1 2 3 4 5 6 7 8 9 22 26
1 2 3 4 5 6 7 8 9 22 26
1 2 3 4 5 6 7 8 9 22 26
1 2 3 4 5 6 7 8 9 22 26
1 2 3 4 5 6 7 8 9 22 26
我可以理解这一点,并通过修改解决

cut -d ' ' -f2-11,24,28 ifile.txt

问题是在每次启动前都有一个空间。但是我想知道一种通用的方法,这样它就不会看到起始空格了。

我假设您的字段是用空格分隔的

你可以试试切割

说明:


为了不重复使用printf,您可以构建一个包含所有所需字段的数组,并在每个字段上循环

{
    n=10
    for (i=1; i<=n; i++)
        a[$i]
    a[$23]
    a[$27]
    for (k in a)
        printf "%f%s", k, FS
    print ""
}
在Perl中,您可以尝试

perl -lane '@F = split ();   print join(" ",@F[0..9,22..26])' input_file > output_file

很抱歉以上两个命令都不能打印我想要的列。建议的剪切命令只打印前4列,然后打印第11-13列。awk命令只打印前4列和11-13列的第一行。@Kayan,分隔符是什么?如果可能,发布一些示例数据。数据用空格分隔。我的第一行数据看起来像'0.001924 0.020849 0.052856 0.068362 0.078583 0.083061 0.082358 0.078637 0.072102 0.063320 0.054825 0.046949 0.040189 0.029273 0.024187 0.020703 0.017581 0.014776 0.012911 0.010987 0.009702 0.008361 0.007341 0.006294 0.005629 0.005049 0.00270.0030.003519900第二个只适用于一条生产线。但第一个命令是正确的方法。注意,您正在混合NR和NF。NR代表记录的编号,通常是行号。所以说awk'NR>=1&&NR对不起!!此命令未打印“我的愿望”列。它正在打印第1、第2、第3、第4、第11和第13列。@Kay您可以共享您的输入文件吗?如果任何字符串出现在行中的任何位置,这将不起作用。是的,我的错误。我已经删除了可能会带来麻烦的答案,并用更好的答案替换。
cut -d ' ' -f1-10,23-27 yourfile
-d - Delimiter

-f - Fields
$del=' '
cut -d "$del" -f1-10,23,27 file
{
    n=10
    for (i=1; i<=n; i++)
        a[$i]
    a[$23]
    a[$27]
    for (k in a)
        printf "%f%s", k, FS
    print ""
}
perl -lane '@F = split ();   print join(" ",@F[0..9,22..26])' input_file > output_file