cut -f 多个参数

cut -f multiple arguments

我有一个变量($var),它包含一系列有序的数字并用逗号分隔。举个例子: 3,31,35,57,85,108,120,130,193,234,266,354,369,406,430,438,472,490,503,553,579,591,629,670,715,742,768,792,813

我最初的计划是使用它们通过下一个代码提取 file1 中的一系列列: cat file1 | cut -f "$var"

终端警告我一个问题:“参数列表太长”。我的 objective 保持不变 — 我可以跟随哪个 strategy/alternative?我需要一些能让我获得所有列的东西(将它们保存或不保存在文件中)。使用循环或任何可以阻止我这样做的东西“manually/individually”。

所需输出的(较小)示例:

123  299    429
12   0      2 
0    0      2
4    15     20
4    22     27
3    2      7
0    0      0
61   155    77
8327 5961   10023
5    11     17 
5777 8840   5669 
10   3      1 
53   365    199 
1    0      3 
26   31     15 
1    0      0

使用 awk:

awk -F, '{ print "," }' file1

在这个例子中,我们将字段分隔符设置为 , 和 -F ,然后仅打印第 4 和第 7 fields/columns。

假设:

  • 您的 file1 包含大量由制表符分隔的列。
  • 您想 select bash 变量“$var”中列出的列。
  • 该列表太长,无法作为命令行参数接受。

那么你会尝试awk解决方案吗:

#!/bin/bash

var="3,31,35,57,85,108,120,130,193,234,266,354,369,406,430,438,472,490,503,553,579,591,629,670,715,742,768,792,813"
echo "$var" > list
# the "echo" command above is for the demonstration purpose only.
# please create a csv file "list" which contains the column list as "var".

awk '
    BEGIN {FS = OFS = "\t"}                     # assign the field separators to TAB
    NR==FNR {len = split([=10=], a, ","); next}     # read the file "list" and assign an array "a" to the list
    {
        result = $a[1]                          # 1st element of the column indexed by array a
        for (i = 2; i <= len; i++)              # loop over the column list
            result = result OFS $a[i]           # append the next element of the indexed column
        print result                            # print the record
    }
' list file1

我们需要将列号列表存储在一个单独的文件“list”中,以避免 Argument list too long 错误。我已经测试了大约。 600KB 列表并且有效。