【发布时间】:2015-08-30 03:54:26
【问题描述】:
这可能是一个简单的问题,但我正在努力寻找解决方案,谁能提供一个简单的 UNIX sed 或 awk 命令来删除从第 5 行开始的文件的每 3 和 4 行。
【问题讨论】:
-
可能有助于显示一些示例输入和您想要的输出。
这可能是一个简单的问题,但我正在努力寻找解决方案,谁能提供一个简单的 UNIX sed 或 awk 命令来删除从第 5 行开始的文件的每 3 和 4 行。
【问题讨论】:
如果您使用的是 GNU sed,则可以使用FIRST~STEP 地址格式,例如。
sed -e '6~3 d' -e '8~4 d' file
删除第 6 行,然后每 3 行,删除第 8 行,然后每 4 行。
【讨论】:
假设我已经了解要求,您可以使用awk,如下所示:
pax$ echo '1
2
3
4
5
6
7
8
9
10
11
12
13
14
15' | awk '{if (((NR - 5) % 4 < 2) || (NR < 5)) {print}}'
1
2
3
4
5
6
9
10
13
14
如您所见,这使用NR(行号)来决定是否打印该行。
从第 5 行开始,它打印两个然后跳过两个,无限循环。低于 5,它会打印所有内容。
如果我完全误解了你想跳过哪些行,那么理论仍然是正确的,你只需要调整if 语句。
【讨论】:
awk '(NR - 5) % 4 < 2 || NR < 5'
一个 awk 解决方案,您将数字作为参数传递:
awk -v start=5 -v d1=3 -v d2=4 '
{n = NR - start}
n > 0 && (n % d1 == 0 || n % d2 == 0) {next}
1
'
这会跳过第 8、11、14、... 和第 9、13、17、...行
【讨论】:
Perl 怎么样?
perl -pi -e 'print if $. < 5 or 1 == $. % 4 or 2 = $. % 4' your_file
【讨论】: