我正在寻找一种方法来删除文本文件中每隔一行的第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
=>打印
概念上更简单GNUsed
potong的变体的回答:
sed '1~2s/S+//3' file