如果只让用之前学过的方法的话,就只能手动这样提取前后缀然后拼接了。对于$2的数字的匹配是贪婪的,会匹配到最后一位数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/dash

# 提取前缀和后缀 以及中间的数字 叠加并拼接

prefix=$(echo "$1" | sed 's/[0-9].*//')
suffix=$(echo "$1" | sed 's/.*[0-9]//')

# 提取数字
n=$(echo "$1" | tr -dc '0-9')
m=$(echo "$2" | tr -dc '0-9')

i="$n"

while [ "$i" -le "$m" ]; do
echo "${prefix}${i}${suffix}"
i=$((i + 1))
done

还有一种方法是shell参数扩展,

Read more »

写完才知道ls 文件名 | wc -l是不多一行可以直接出结果的 ,我用的是-l会多一行total。
我以为不加选项的ls是没法用wc的,因为似乎不是每行一个输出。

值得注意的是这个*,它会匹配当前目录下的所有文件和目录,包括隐藏文件和目录。
这里的*是通配符,触发了shell的路径名展开机制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/dash

# 当前目录下的目录 其内有多少个是具有两个以上文件或目录的

for item in *; do
if [ -d "$item" ]; then
count=$(ls -l "$item" | wc -l)
count=$((count - 1))

if [ "$count" -ge 2 ]; then
echo "$item"
fi
fi
done

q1的python-stdin实现

用startswith来匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3

import sys

count = 0

for line in sys.stdin:
field = line.strip().split("|")

if len(field) >=2 and field[-2].startswith("3711/"):
count += 1

print(count)

0难度

1
2
3
#!/bin/dash

grep "|3711/" | wc -l

先检查是否已经存在拓展名,即文件名中是否包含”.”

然后检查开头是不是#!

再检查这个第一行是否包含有效的解释器,但应该是不需要检验可用性的,只需要看是否有那个字样

Read more »

写一个python脚本接受两个文件名参数,先对比两个文件中的总行数,如果不同则报错退出,如果相同则翻转第二个文件后逐行对比,如果发现不同则输出其第一个文件的行号。

也不需要想队列和堆,直接list然后反转后遍历。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python3

import sys

file1_name = sys.argv[1]
file2_name = sys.argv[2]
file1 = []
file2 = []
with open(file1_name) as f1:
for line in f1:
if not line:
continue
file1.append(line.strip())
with open(file2_name) as f2:
for line in f2:
if not line:
continue
file2.append(line.strip())

if len(file1) != len(file2) :
print(f"Not mirrored: different number of lines: {len(file1)} versus {len(file2)}")
sys.exit(0)

file2=file2[::-1]

for i in range(len(file1)):
if file1[i] != file2[i]:
print(f"Not mirrored: line {i+1} different")
sys.exit(0)

print("Mirrored")

针对特定的奖项,找出它的“最早获奖年份(Min)”和“最晚获奖年份(Max)”。然后在这个 [Min, Max] 的闭区间内,找出所有没有颁发该奖项的年份,并输出。

脚本接收两个位置参数:

$1:一个用于匹配奖项名称的正则表达式(Regex)。

Read more »

因为提到了作为头和尾的nm都是不会变的,所以有两种办法。

第一种是用等差数列求和公式,期望的从n到m之和对比目前实际和和之差就是缺省的数。

第二种方法是排序之后从最小的数遍历,如果当前数和期望的数不一致,那么就输出期望的数,然后期望的数加一,继续遍历,如果一致,就期望的数加一,继续遍历。

Read more »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python3
import sys

def main():
# 使用集合 (set) 自动处理去重需求
male_surnames = set()

# sys.stdin 允许直接遍历标准输入流,每次迭代读取一行
for line in sys.stdin:
# 去除行末尾的换行符和潜在的空白字符
line = line.strip()
if not line:
continue

# 等效于 cut -d'|'
fields = line.split('|')

# 确保数据格式正确且最后一个字段为 'M' (等效于 grep '|M$')
if len(fields) == 5 and fields[4] == 'M':
# 提取姓名列 (0-based index, 第3列索引为2)
name_field = fields[2]

# 等效于 cut -d',' -f1
surname = name_field.split(',')[0].strip()

# 存入集合自动去重
male_surnames.add(surname)

# sorted() 将无序集合转换为按字母表排序的列表
for surname in sorted(male_surnames):
print(surname)

if __name__ == '__main__':
main()

一、 读题与需求拆解

1. 数据结构分析:
输入数据通过标准输入 (< enrollments.txt) 传入,为标准的管道符 | 分隔文件,共 5 个字段。
例如:COMP1917|3360379|Costner, Kevin Augustus |3978/1|M

  • 字段 3 (Name):内部具有二级结构,格式为 [Surname], [First Names]
  • 字段 5 (Gender):标识性别,男性为 M
Read more »
0%