删除第 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
我正在寻找一种方法来删除文本文件中每隔一行的第 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