本题要求实现uniq命令,对于相邻的重复行(包括连续n (n≥3)行重复的情况),只保留一行。题目保证文件每一行的大小不超过64字节。需要实现的功能 打开文件,argv[1]为输入文件的路径 当文件路径非法时,打印can't open file,结尾带换行符 读取文件,对所有相邻行,若其重复,则仅保留一行。注意保留行尾的换行符 创建文件,argv[1]为输出文件的路径(同一文件),写入去重后的行 输入样例 Shizuoka 0 Shizuoka 0 Kanagawa 1 Kanagawa 1 Toukyou 2 Toukyou 2 Saitama 3 Saitama 3 Chiba 4 Chiba 4 输出样例 Shizuoka 0 Kanagawa 1 Toukyou 2 Saitama 3 Chiba 4
时间: 2023-06-13 10:03:02 浏览: 111
以下是Python实现uniq命令的代码,你可以参考:
```python
import sys
if len(sys.argv) != 2:
print("Usage: python3 uniq.py <filename>")
sys.exit(1)
filename = sys.argv[1]
try:
with open(filename, 'r') as f:
lines = f.readlines()
except:
print("can't open file")
sys.exit(1)
new_lines = []
prev_line = None
for line in lines:
if line != prev_line:
new_lines.append(line)
prev_line = line
with open(filename, 'w') as f:
f.writelines(new_lines)
```
代码说明:
首先,我们需要检查命令行参数是否正确,即输入文件路径是否提供。
然后,我们尝试打开文件,如果文件无法打开,则输出错误信息并退出程序。
接下来,我们遍历文件的每一行,如果当前行和前一行不同,则将当前行添加到新列表中,并将前一行更新为当前行。
最后,我们将新列表中的行写回文件中,覆盖原来的内容。
相关问题
本题要求实现uniq命令,对于相邻的重复行(包括连续n (n≥3)行重复的情况),只保留一行。题目保证文件每一行的大小不超过64字节。需要实现的功能 打开文件,argv[1]为输入文件的路径 当文件路径非法时,打印can't open file,结尾带换行符 读取文件,对所有相邻行,若其重复,则仅保留一行。注意保留行尾的换行符 创建文件,argv[1]为输出文件的路径(同一文件),写入去重后的行 输入样例 Shizuoka 0 Shizuoka 0 Kanagawa 1 Kanagawa 1 Toukyou 2 Toukyou 2 Saitama 3 Saitama 3 Chiba 4 Chiba 4 输出样例 Shizuoka 0 Kanagawa 1 Toukyou 2 Saitama 3 Chiba 4 C语言实现
下面是一个简单的C语言实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LINE_LEN 64
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
FILE* fp = fopen(argv[1], "r");
if (!fp) {
printf("Can't open file.\n");
return 1;
}
char buffer[MAX_LINE_LEN + 1];
char last_line[MAX_LINE_LEN + 1] = {0};
while (fgets(buffer, MAX_LINE_LEN + 1, fp)) {
if (strcmp(buffer, last_line) != 0) {
printf("%s", buffer);
strncpy(last_line, buffer, MAX_LINE_LEN);
}
}
fclose(fp);
fp = fopen(argv[1], "w");
if (!fp) {
printf("Can't open file.\n");
return 1;
}
rewind(fp);
while (fgets(buffer, MAX_LINE_LEN + 1, stdin)) {
if (strcmp(buffer, last_line) != 0) {
fputs(buffer, fp);
strncpy(last_line, buffer, MAX_LINE_LEN);
}
}
fclose(fp);
return 0;
}
```
该程序首先尝试打开命令行参数指定的文件,如果文件不存在或者无法打开,则输出错误信息并退出。接着,该程序逐行读取文件内容,并与上一行进行比较。如果两行不同,则输出该行,并将该行保存为上一行。最后,该程序重新打开文件,并将去重后的内容写入同一文件中。需要注意的是,由于fgets函数读取的每一行都会包含行尾的换行符,因此输出和写入文件时需要保留该换行符。
附件name.txt中包含人名和成绩,请使用uniq命令将其中重复的行删除;并将处理后的结果重定向到result.txt文件。 提示:uniq经常和sort搭配使用。
可以使用以下命令来实现:
```
sort name.txt | uniq > result.txt
```
这条命令首先使用 `sort` 命令将 `name.txt` 中的内容按照字典序排序,然后使用 `uniq` 命令将其中重复的行删除,并将结果重定向到 `result.txt` 文件中。这样处理后,`result.txt` 中就不会有重复的行了。
阅读全文