如何从linux中的数据文件中删除第一列(实际上是行名)?

新手上路,请多包涵

我有数千列和行的数据文件。我想删除实际上是行计数器的第一列。我在linux中使用了这个命令:

 cut -d " " -f 2- input.txt > output.txt

但我的输出没有任何改变。有谁知道为什么它不起作用,我该怎么办?

这是我的输入文件的样子:

 col1 col2 col3 col4 ...
     1 0 0 0 1
     2 0 1 0 1
     3 0 1 0 0
     4 0 0 0 0
     5 0 1 1 1
     6 1 1 1 0
     7 1 0 0 0
     8 0 0 0 0
     9 1 0 0 0
     10 1 1 1 1
     11 0 0 0 1
    .
    .
    .

我希望我的输出如下所示:

 col1 col2 col3 col4 ...
0 0 0 1
0 1 0 1
0 1 0 0
0 0 0 0
0 1 1 1
1 1 1 0
1 0 0 0
0 0 0 0
1 0 0 0
1 1 1 1
0 0 0 1
.
.
.

我还尝试了 sed 命令:

  sed '1d' input.file > output.file

但它会删除第一行而不是第一列。

有人可以指导我吗?

原文由 zara 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 662
2 个回答

@Karafka 我有 CSV 文件,所以我添加了“,”分隔符(你可以用你的替换

cut -d"," -f2- input.csv  > output.csv

然后,我使用循环遍历目录中的所有文件

# files are in the directory tmp/
for f in tmp/*
do
    name=`basename $f`
    echo "processing file : $name"
    #kepp all column excep the first one of each csv file

    cut -d"," -f2- $f > new/$name
    #files using the same names are stored in directory new/
done

原文由 Fouad Djebbar 发布,翻译遵循 CC BY-SA 3.0 许可协议

cut 的惯用用法是

cut -f2- input > output

如果您的分隔符是制表符(“\t”)。

或者,简单地使用 awk 魔法(适用于空格和制表符分隔符)

  awk '{$1=""}1' input | awk '{$1=$1}1' > output

第一个 awk 将删除字段 1,但留下一个分隔符,第二个 awk 删除分隔符。默认输出分隔符将是空格,如果要更改为制表符,请将 -vOFS="\t" 添加到第二个 awk。

更新

根据您更新的输入,问题是切割视为多列的初始空间。一种解决方法是在喂食切割之前先将它们移除

sed 's/^ *//' input | cut -d" " -f2- > output

或使用上面的 awk 替代方案,它也适用于这种情况。

原文由 karakfa 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题