【问题标题】:Delete every 2nd word of 3rd column a text删除第 3 列的每个第 2 个单词一个文本
【发布时间】:2021-12-11 09:01:35
【问题描述】:

我正在寻找一种方法来删除文本文件中每隔一行的第三列。示例输入:

4444    pm  7654    army    3687    anywhere    5650    infection
7332    thesis  0638    nasa    3976    condition   0738    los
3549    partners    7584    fee 3930    move    6535    friends
5693    matter  8801    visits  5350    grid    8917    honest
4039    facing  5453    cp  6101    bedrooms    5268    ford

期望的输出:

4444    pm      army    3687    anywhere    5650    infection
7332    thesis  0638    nasa    3976    condition   0738    los
3549    partners    fee 3930    move    6535    friends
5693    matter  8801    visits  5350    grid    8917    honest
4039    facing  cp  6101    bedrooms    5268    ford

我知道两个命令。

awk '{print $3}' input.txt
sed '1~2d' 输入.txt

但我不确定如何组合它们。

期待任何形式的帮助或建议。

【问题讨论】:

  • 你的字段分隔符是什么?多个空格还是一个制表符?
  • 你用的是 Ubuntu 还是 Unix?
  • 我用的是 ubuntu。空格不一致(多个空格)。

标签: ubuntu awk sed


【解决方案1】:

这可能对你有用(GNU sed):

sed 's/\S\+//3;n'  file

删除第 3 列,打印结果并获取下一行,重复。

【讨论】:

  • 哇...现在这很简洁 :) 干得好!
【解决方案2】:

使用gnu awk,您可以获得每隔一行,并使用一个模式来捕获前两个单词,匹配前导空格字符和第三个单词,然后在第 2 组中捕获其余部分。

然后您可以打印 2 个捕获组的值。

awk 'NR%2==1 && match($0, /^(\S+\s+\S+)\s+\S+(.*)/, a) {
    print a[1], a[2]
    next
}1' file

输出

4444    pm      army    3687    anywhere        5650    infection
7332    thesis  0638    nasa    3976    condition       0738    los
3549    partners        fee     3930    move    6535    friends
5693    matter  8801    visits  5350    grid    8917    honest
4039    facing  cp      6101    bedrooms        5268    ford

【讨论】:

    【解决方案3】:

    假设您的文件确实被称为input.txt

    sed -r '1~2s/^(\w+\W+\w+\W+)\w+\W+(.*)/\1\2/' input.txt
    4444    pm  army    3687    anywhere    5650    infection
    7332    thesis  0638    nasa    3976    condition   0738    los
    3549    partners    fee 3930    move    6535    friends
    5693    matter  8801    visits  5350    grid    8917    honest
    4039    facing  cp  6101    bedrooms    5268    ford
    

    地址运算符 1~2(顺便说一句,它是 GNU sed 特定的)执行“模”运算,对每个不均匀编号的行进行运算。
    替换操作s///记住前两个单词/空格对,匹配第三个,并记住后面的所有内容;然后将原始行替换为除第三列之外的所有列。

    【讨论】:

      【解决方案4】:

      怎么样:

       awk '{if (NR % 2 == 1){$3="";}print}' input.txt
      

      NR => 行号从 1 开始。
      所以(NR % 2 == 1)从第一行开始每隔一行。

      $3="" => 删除第三个单词。

      print => 打印该行

      【讨论】:

      • 这也是我最初的方法,但它填满了分隔符(将行上的输出折叠成一个空格)。
      【解决方案5】:

      概念上更简单的 GNU sed potong's answer 的变体:

       sed '1~2s/\S\+//3' file
      

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        • 2018-03-24
        相关资源
        最近更新 更多