删除文本中第三列的每个第二个单词



我正在寻找一种方法来删除文本文件中每隔一行的第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的{打印3美元}input.txt
sed的1 ~ 2 d input.txt

但是我不知道如何把它们结合起来。

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

这可能适合您(GNU sed):

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

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

使用gnu awk,您可以获取每第二行,并使用模式捕获前两个单词,匹配前导空白字符和第三个单词,并捕获第二组中它之后的其余单词。

然后打印两个捕获组的值

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

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

sed -r '1~2s/^(w+W+w+W+)w+W+(.*)/12/' 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的)执行"模块"操作,对每个非均匀编号行进行操作。
替换操作s///记住前两批字/空格对,匹配第三批,并记住之后的所有内容;然后用除第三列以外的所有列替换原始行。

如何:

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

NR=>从1开始的行号。
那么(NR % 2 == 1)从第一行开始,每隔第二行。

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

print=>打印

概念上更简单GNUsedpotong的变体的回答:

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

相关内容

  • 没有找到相关文章

最新更新