从特定行Linux开始删除最后四列

发布于 2025-02-13 00:53:41 字数 1614 浏览 2 评论 0原文

这是我的数据的一部分,

 759 L   0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 760 Y   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 761 H   0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 762 T   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 763 T   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 764 D   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 765 R   0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 766 F   0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
 767 W   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
 768 A   1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 769 N   0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 770 C   0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 771 L   0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 772 G   0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
 773 Y   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 774 S   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
 775 H   0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 776 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 777 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 778 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 779 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 780 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 781 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 782 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 783 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 784 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 785 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 786 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

我想从第776行到末尾删除最后四个0,以便列号与上一行匹配。定界符是空格。我知道所有行,我可以使用,

cut -f 21-

但是如何将其用特定的行与Whitepace作为定界符进行?谢谢

Here is part of my data

 759 L   0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 760 Y   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 761 H   0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 762 T   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 763 T   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 764 D   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 765 R   0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 766 F   0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
 767 W   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
 768 A   1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 769 N   0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 770 C   0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 771 L   0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 772 G   0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
 773 Y   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 774 S   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
 775 H   0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 776 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 777 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 778 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 779 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 780 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 781 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 782 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 783 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 784 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 785 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 786 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

I want to delete last four 0s starting from line 776 to the end so that the column number matches with the previous rows. The delimiters are whitespace. I know for all rows, I can use

cut -f 21-

but how to How can I make it with specific rows with whitespace as delimiter? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不语却知心 2025-02-20 00:53:41

在任何Posix Awk中,都不更改其余字段之前或之后的任何间距:

awk 'NR>775{sub(/([[:space:]]+[^[:space:]]+){4}[[:space:]]*$/,"")} 1' file

In any POSIX awk, without changing any of the spacing before/after or between the remaining fields:

awk 'NR>775{sub(/([[:space:]]+[^[:space:]]+){4}[[:space:]]*$/,"")} 1' file
灵芸 2025-02-20 00:53:41

如果这些是实际的行号,那么也许您只想要:

awk 'NR>775{NF=22}1' input-file

如果这些数字不是行号,而是第一列中的数据,那么也许您想要:

awk '$1>775{NF=22}1' input-file

If those are actual line numbers, then perhaps you just want:

awk 'NR>775{NF=22}1' input-file

If those numbers are not line numbers, but are data in the first column, then perhaps you want:

awk '$1>775{NF=22}1' input-file
野稚 2025-02-20 00:53:41

由于我不清楚的原因,如果我将双重空间崩溃并破坏了它的格式,我只能到达上半场nf = 22

如果您非常确保nf计数为2226,然后将完美排列,然后只是做

  awk nf = 22
 

干净而简单 - 没有REGEX,没有功能调用,没有数组拆分,没有状态跟踪,没有c? t:f

保持原始格式完整:

  • 方法1: 真正的原油 在值中的硬编码方法:
  awk'2< nf&& nf- = 3*(775< nr)'fs ='\\ 40' 
 
  • 方法2:新nf使用它看到的第一行:
  mawk'__< = _ {__ = nf-!_}+$ _< 776 || nf = __'fs ='[]' 
gawk'__< = _? __ = nf  - !_:nr< 776 || nf = __'fs ='[]'#是1st col 
                                                #和NR一样吗?
 
 759 L   0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 760 Y   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 761 H   0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 762 T   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 763 T   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 764 D   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 765 R   0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 766 F   0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
 767 W   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
 768 A   1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 769 N   0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 770 C   0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 771 L   0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 772 G   0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
 773 Y   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 774 S   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
 775 H   0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 776 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 777 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 778 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 779 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 780 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 781 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 782 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 783 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 784 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 785 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 786 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

for reasons unclear to me, I can only get to NF = 22 for first half if I collapse the double space in between and ruin the formatting of it.

If you're very sure the NF counts are 22 and 26, and will perfectly line up afterwards, then just do

awk NF=22

clean and simple — no regex, no function calls, no array splits, no state tracking, and no C ? T : F

To keep original formatting intact :

  • approach 1 : really crude method of hard-coding in values :
awk '2<NF && NF-=3*(775<NR)' FS='\\40' 
  • approach 2 : new NF using 1st row it sees :
mawk '__<=_{ __=NF-!_ }+$_<776||NF=__' FS='[ ]' 
gawk '__<=_? __=NF-!_ : NR<776||NF=__' FS='[ ]' # is 1st col 
                                                # same as NR ?
 759 L   0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 760 Y   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 761 H   0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 762 T   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 763 T   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 764 D   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 765 R   0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 766 F   0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
 767 W   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
 768 A   1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 769 N   0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 770 C   0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 771 L   0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
 772 G   0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
 773 Y   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 774 S   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
 775 H   0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 776 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 777 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 778 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 779 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 780 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 781 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 782 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 783 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 784 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 785 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 786 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文