【问题标题】:Can't cut column in Linux无法在 Linux 中剪切列
【发布时间】:2014-07-01 02:56:45
【问题描述】:

我有一个这样的文件

ATOM   3197 HD13 ILE   206       9.900  15.310  13.450  0.0196 1.4870
ATOM   3198  C   ILE   206      10.870  16.560  17.500  0.8343 1.9080
ATOM   3199  OXT ILE   206      11.780  15.734  17.425 -0.8190 1.6612
ATOM   3200  O   ILE   206       9.929  16.225  18.095 -0.8190 1.6612

我想剪掉第二列,但是当我使用时

cut -f1,3,4,5,6,7,8,9,10 filename

它不起作用。我是不是做错了什么?

【问题讨论】:

标签: cut


【解决方案1】:

这是因为有多个空格,cut 只能一个一个处理。

你可以从第5个位置开始:

$ cut -d' ' -f 1,5- file
ATOM HD13 ILE   206       9.900  15.310  13.450  0.0196 1.4870
ATOM  C   ILE   206      10.870  16.560  17.500  0.8343 1.9080
ATOM  OXT ILE   206      11.780  15.734  17.425 -0.8190 1.6612
ATOM  O   ILE   206       9.929  16.225  18.095 -0.8190 1.6612

或使用tr -s 压缩空格,如下所示(但会丢失多个空格):

$ tr -s ' ' < file | cut -d' ' -f1,3,4,5,6,7,8,9,10
ATOM HD13 ILE 206 9.900 15.310 13.450 0.0196 1.4870
ATOM C ILE 206 10.870 16.560 17.500 0.8343 1.9080
ATOM OXT ILE 206 11.780 15.734 17.425 -0.8190 1.6612
ATOM O ILE 206 9.929 16.225 18.095 -0.8190 1.6612

请注意,您可以从3 到结尾以3- 表示:

tr -s ' ' < file | cut -d' ' -f1,3-

事实上,我会为此使用awk

awk '{$2=""; print}' file

或者只是

awk '{$2=""} 1' file

【讨论】:

  • 哇,它确实有效。但是有什么办法可以保留其他列的格式以保持清晰?
  • 是的,当然,请参阅cut -d' ' -f 1,5- fileawk 方式的选项。
  • 我有一个问题。为什么和'cut -f1,3,4,5,6,7,8,9,10 filename'不一样?
  • 因为列之间有多个空格,所以第2个为空,第3个为空,以此类推。一次打印一列可以看到:cut -f3 file,@987654334 @等
  • 实际上它并没有剪切前 999 行。我不知道怎么了。
【解决方案2】:

您的文件中有很多空格。所以,你必须从空格数开始。

new.txt 包含

ATOM   3197 HD13 ILE   206       9.900  15.310  13.450  0.0196 1.4870
ATOM   3198  C   ILE   206      10.870  16.560  17.500  0.8343 1.9080
ATOM   3199  OXT ILE   206      11.780  15.734  17.425 -0.8190 1.6612
ATOM   3200  O   ILE   206       9.929  16.225  18.095 -0.8190 1.6612

这是打印第二列的命令

root@52:/home/ubuntu# cut -d' ' -f4 new.txt

3197
3198
3199
3200

其中 -d 代表分隔符,即 'space' 在这种情况下用 ' ' 表示

但是,在这种情况下,awk 非常方便

**# awk '{print $2}' new.txt**

【讨论】:

    【解决方案3】:

    您可以在该列的第一行(3197)选择内容的位置,然后用awk选择所有行中相同位置的字符串:

    cat filename | awk -v field="3197" 'NR==1 {c = index($0,field)} {print substr($0,c,length(field))}'
    

    来源:https://unix.stackexchange.com/a/491770/20661

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 2023-04-05
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2015-07-21
      相关资源
      最近更新 更多