删除第 3 列的每 2 个单词一个文本

Delete every 2nd word of 3rd column a text

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

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 }' input.txt
sed '1~2d' input.txt

但我不知道如何组合它们。

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

假设您的文件确实名为 input.txt:

sed -r '1~2s/^(\w+\W+\w+\W+)\w+\W+(.*)//' 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/// 记住 前两批 word/whitespace 对,匹配第 3 对,并记住之后的所有内容;然后用除第三列以外的所有内容替换原始行。

怎么样:

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

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

="" => 删除第三个字。

print => 打印行

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

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

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

使用 gnu awk 你可以每隔一行获取一次,并使用一个模式来捕获前 2 个单词,匹配前导空白字符和第三个单词,并在第 2 组中捕获它之后的其余部分。

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

awk 'NR%2==1 && match([=10=], /^(\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

概念上更简单 GNU sed 的变体:

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