[译]Org-mode中的AWK源码块

本文翻译了Org-mode中AWK源码块的使用指南,包括Header参数、Sessions特性和使用案例。AWK是一种针对记录数据操作的语言,与Org模式的表格结合使用效果良好。在Org-mode中启用AWK支持需要配置变量,源码块有特定的Header参数,但不支持Session。文中提供了从GNU Awk用户手册选取的实际应用示例。

原文地址:https://lujun9972.github.io/blog/2020/04/22/[译]org-mode中的awk源码块/index.html

最近玩AWK比较多,刚好看到org原生支持AWK,想着以后可能会常用,索性翻译一下,方便下次翻阅。

原文地址:https://www.orgmode.org/worg/org-contrib/babel/languages/ob-doc-awk.html

简介

AWK 是一门基于正则表达式的专为操作记录数据而优化的特定任务语言. 其小巧但图灵完备,执行效率高,易于表达,功能强大, 且语法独特.

Org mode中的表正好用来表示 AWK 处理的记录数据.

要求和配置

AWK的变种有很多. 变量 org-babel-awk-command 可以设置 AWK 可执行文件的名称. 默认值为 "awk".

要在Org mode中启用 AWK 源码块支持, 向 org-babel-load-languages 添加合适的点对(dotted pair)即可

(org-babel-do-load-languages
 'org-babel-load-languages
 '((awk . t)))

Org-mode中AWK源码块的功能特点

Header 参数

有三个 AWK 特有的 header 参数.

:cmd-line
指定传递给 AWK 命令的命令行参数
:in-file
指定 AWK 处理的数据文件路径
:stdin
指定某个Org-mde的数据或代码块引用, 其值会通过STDIN传递给 AWK 进程

Sessions

AWK 不支持session

使用案例

下面两个例子来自于 GNU Awk 用户手册.

假设有这么一个表格 bbs-list

#+name: bbs-list
| aardvark | 555-5553 | 1200/300      | B |
| alpo-net | 555-3412 | 2400/1200/300 | A |
| barfly   | 555-7685 | 1200/300      | A |
| bites    | 555-1675 | 2400/1200/300 | A |
| camelot  | 555-0542 | 300           | C |
| core     | 555-2912 | 1200/300      | C |
| fooey    | 555-1234 | 2400/1200/300 | B |
| foot     | 555-6699 | 1200/300      | B |
| macfoo   | 555-6480 | 1200/300      | A |
| sdace    | 555-3430 | 2400/1200/300 | A |
| sabafoo  | 555-2127 | 1200/300      | C |

以及 AWK 源码块

#+begin_src awk :stdin bbs-list
/foo/ { print $0 }
#+end_src

会输出原表中的一个子集

#+results:
| fooey   | 555-1234 | 2400/1200/300 | B |
| foot    | 555-6699 | 1200/300      | B |
| macfoo  | 555-6480 | 1200/300      | A |
| sabafoo | 555-2127 | 1200/300      | C |

假设有一个名为 inventory-shipped 的表格

#+name: inventory-shipped
| Jan | 13 | 25 | 15 | 115 |
| Feb | 15 | 32 | 24 | 226 |
| Mar | 15 | 24 | 34 | 228 |
| Apr | 31 | 52 | 63 | 420 |
| May | 16 | 34 | 29 | 208 |
| Jun | 31 | 42 | 75 | 492 |
| Jul | 24 | 34 | 67 | 436 |
| Aug | 15 | 34 | 47 | 316 |
| Sep | 13 | 55 | 37 | 277 |
| Oct | 29 | 54 | 68 | 525 |
| Nov | 20 | 87 | 82 | 577 |
| Dec | 17 | 35 | 61 | 401 |
|     |    |    |    |     |
| Jan | 21 | 36 | 64 | 620 |
| Feb | 26 | 58 | 80 | 652 |
| Mar | 24 | 75 | 70 | 495 |
| Apr | 21 | 70 | 74 | 514 |

以及这么一小段 AWK 代码

#+begin_src awk :stdin inventory-shipped :exports results
$1 ~ /J/
#+end_src

会输出其中的一个子集

#+results:
| Jan | 13 | 25 | 15 | 115 |
| Jun | 31 | 42 | 75 | 492 |
| Jul | 24 | 34 | 67 | 436 |
| Jan | 21 | 36 | 64 | 620 |
<think> 我们当前需要解决两个主要问题: 1. 解决执行 `sudo dkms install -m nvidia -v 510.108.03` 时出现的模源目录不存在错误。 2. 理解并处理后续可能出现的nvidia内核模(如nvidia-modeset.ko, nvidia-drm.ko, nvidia-uvm.ko)的安装信息,尤其是版本不匹配或模已被加载的问题。 根据用户提供的引用内容,我们可以归纳出以下关键点: - 引用[1]:模版本不匹配会导致初始化失败(例如nvidia-modeset.ko和nvidia-drm.ko版本不一致)。 - 引用[2][3][4][5]:安装驱动时如果内核模已被加载(如nvidia-drm, nvidia-modeset, nvidia-uvm),会导致安装失败,需要卸载这些模或杀死相关进程。 结合用户上一次的问题(dkms找不到源目录)以及本次补充的引用,我们制定解决方案: ### 第一部分:解决源目录不存在的问题(续接之前的解决方案) 我们已经知道,源目录 `/usr/src/nvidia-510.108.03` 不存在。可能的原因和解决方案如下: #### 原因1:驱动包未安装或安装不完整 解决方案:重新安装驱动包,确保安装包含DKMS模的包。 步骤: 1. 首先,确认系统已安装的NVIDIA驱动包: ```bash dpkg -l | grep -E 'nvidia-driver-510|nvidia-dkms-510' ``` 2. 如果未安装,则安装: ```bash sudo apt install nvidia-driver-510 nvidia-dkms-510 ``` 或者,如果已经安装但可能不完整,重新安装: ```bash sudo apt install --reinstall nvidia-driver-510 nvidia-dkms-510 ``` #### 原因2:安装的驱动版本与指定的版本字符串不完全匹配 注意:`510.108.03` 是完整的版本号,但实际安装的包可能在其版本字符串中使用了不同的格式(例如,省略了补丁号)。我们可以检查实际存在的目录: 1. 查看`/usr/src`目录下实际存在的NVIDIA相关目录: ```bash ls /usr/src | grep nvidia ``` 可能输出类似: ``` nvidia-510.108.03 ``` 或者 ``` nvidia-510.108 ``` 如果实际目录名是`nvidia-510.108`,而命令中指定的是`510.108.03`,则会导致目录不存在。 2. 解决方法:创建符号链接(假设实际目录为`nvidia-510.108`): ```bash sudo ln -s /usr/src/nvidia-510.108 /usr/src/nvidia-510.108.03 ``` 或者,在DKMS命令中使用实际目录的版本号(如果目录存在但版本字符串不同): ```bash sudo dkms install -m nvidia -v 510.108 # 注意去掉最后的'.03' ``` 3. 如果实际目录是`nvidia-510.108.03`,但安装时没有生成该目录,可能是包安装问题,重新安装`nvidia-dkms-510`。 ### 第二部分:处理内核模安装时可能出现的模已加载或版本不匹配问题 在成功解决源目录问题后,执行`dkms install`时可能会遇到内核模相关的错误。根据引用内容,主要有两类问题: #### 问题1:模已加载(如nvidia-drm, nvidia-modeset, nvidia-uvm) 错误信息示例: ``` An NVIDIA kernel module 'nvidia-drm' appears to already be loaded in your kernel. ``` 解决方案:需要先卸载这些模,并确保没有进程占用。 步骤(参考引用[2][3][4][5]): 1. 切换到文本模式(关闭图形界面,因为图形界面会占用GPU): ```bash sudo systemctl isolate multi-user.target ``` 或者使用`init 3`(根据系统发行版可能不同)。 2. 查看已加载的nvidia模: ```bash lsmod | grep nvidia ``` 输出可能包括:`nvidia_drm`, `nvidia_modeset`, `nvidia_uvm`, `nvidia`等。 3. 如果没有进程使用,尝试卸载模(注意顺序,后加载的先卸载): ```bash sudo modprobe -r nvidia_drm sudo modprobe -r nvidia_modeset sudo modprobe -r nvidia_uvm sudo modprobe -r nvidia ``` 如果遇到模正在被使用,使用`lsof`查找并杀死进程: ```bash sudo lsof -n -w /dev/nvidia* ``` 杀死相关进程(使用`kill -9 <PID>`)。 4. 如果模卸载失败,可能是因为内核不支持卸载或模被占用。此时,重启系统并在启动时进入恢复模式或文本模式(在grub中选择recovery mode,然后进入root shell),然后尝试卸载模或直接安装驱动。 5. 在卸载完模后,重新安装DKMS模: ```bash sudo dkms install -m nvidia -v 510.108.03 # 或实际使用的版本 ``` 6. 安装完成后,重新启动图形界面: ```bash sudo systemctl start graphical.target ``` #### 问题2:模版本不匹配 错误信息示例(引用[1]): ``` Version mismatch: nvidia-modeset.ko(535.104.05) nvidia-drm.ko(535.86.05) ``` 这通常是因为系统中存在多个版本的驱动模,或者之前安装的驱动未完全卸载。 解决方案: 1. 彻底卸载所有NVIDIA驱动及相关模: ```bash sudo apt purge nvidia-* sudo apt autoremove ``` 2. 手动清理残留文件: ```bash sudo rm -rf /usr/src/nvidia-* sudo rm -f /lib/modules/`uname -r`/kernel/drivers/gpu/drm/nouveau/nouveau.ko* sudo rm -f /lib/modules/`uname -r`/kernel/drivers/gpu/drm/nvidia-drm.ko* # 注意:这里要小心,不要误删其他驱动 ``` 3. 重新安装驱动。 ### 完整流程建议 为了避免上述问题,建议按照以下步骤操作: 1. 卸载现有驱动(如果有): ```bash sudo apt purge nvidia-* sudo apt autoremove ``` 2. 清理残留模和目录: ```bash sudo rm -rf /usr/src/nvidia-* # 清理内核模目录 sudo rm -f /lib/modules/`uname -r`/kernel/drivers/gpu/drm/nouveau/nouveau.ko* sudo rm -f /lib/modules/`uname -r`/kernel/drivers/gpu/drm/nvidia-drm.ko* sudo rm -f /lib/modules/`uname -r`/extra/nvidia.ko* sudo rm -f /lib/modules/`uname -r`/extra/nvidia-drm.ko* sudo rm -f /lib/modules/`uname -r`/extra/nvidia-modeset.ko* sudo rm -f /lib/modules/`uname -r`/extra/nvidia-uvm.ko* # 更新initramfs sudo update-initramfs -u ``` 3. 重启进入文本模式(或恢复模式): ```bash sudo systemctl isolate multi-user.target ``` 4. 安装驱动(包括dkms包): ```bash sudo apt install nvidia-driver-510 nvidia-dkms-510 ``` 5. 如果安装后仍然需要手动执行dkms,则: ```bash sudo dkms install -m nvidia -v 510.108.03 # 根据实际目录名调整版本号 ``` 6. 重启系统: ```bash sudo reboot ``` 7. 验证: ```bash nvidia-smi dkms status ``` ### 总结 通过以上步骤,用户应该能够解决源目录不存在的问题,并避免后续可能出现的模加载冲突和版本不匹配问题。关键点在于彻底清理旧驱动、安装完整的驱动包(包括dkms)、在安装前确保没有模被加载。 ### 相关问题 1. 如何检查当前系统安装的NVIDIA驱动版本? 2. 如何查看系统中已加载的内核模? 3. 在Ubuntu中如何完全卸载NVIDIA驱动? 4. 如何防止NVIDIA驱动在系统更新时被覆盖? 5. 安装NVIDIA驱动后图形界面无法启动的解决方法? [^1]: 模版本不一致会导致初始化失败 [^2]: 内核模已被加载的解决方法 [^3]: 卸载冲突的内核模 [^4]: 通过系统服务管理图形界面状态 [^5]: 驱动安装过程中内核模问题的官方解释 </think> ### 解决 NVIDIA DKMS 安装错误及内核模问题分析 #### 一、解决模源目录不存在错误 当执行 `sudo dkms install -m nvidia -v 510.108.03` 出现目录不存在错误时,表示 DKMS 找不到驱动源码。以下是完整的解决方案: 1. **验证驱动包安装状态** ```bash dpkg -l | grep nvidia-driver-510 ``` - 若无输出,说明驱动未安装,执行: ```bash sudo apt install nvidia-driver-510 nvidia-dkms-510 ``` 2. **修复源码目录缺失** ```bash # 重新安装包含源码的DKMS包 sudo apt install --reinstall nvidia-dkms-510 # 检查实际生成的源码目录名 ls /usr/src | grep nvidia # 若目录名不完全匹配(如nvidia-510.108),创建符号链接 sudo ln -s /usr/src/nvidia-510.108 /usr/src/nvidia-510.108.03 ``` 3. **手动添加并安装模** ```bash sudo dkms add -m nvidia -v 510.108.03 sudo dkms install -m nvidia -v 510.108.03 ``` 4. **验证安装** ```bash dkms status | grep nvidia # 应显示"installed" nvidia-smi # 检查驱动是否正常运行 ``` #### 二、NVIDIA 内核模问题分析 当出现 `nvidia-modeset.ko`、`nvidia-drm.ko` 等模相关错误时,通常表示模冲突或版本不一致: 1. **模版本不匹配问题**(如引用[1]) - **现象**:`Version mismatch: nvidia-modeset.ko(535.104.05) nvidia-drm.ko(535.86.05)` - **原因**:系统中残留旧版模文件 - **解决方案**: ```bash # 彻底清除旧模 sudo apt purge nvidia-* sudo rm -rf /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/nvidia* sudo update-initramfs -u # 重新安装驱动 sudo apt install nvidia-driver-510 ``` 2. **模已被加载问题**(如引用[2][5]) - **现象**:`An NVIDIA kernel module 'nvidia-drm' appears to already be loaded` - **解决方案**: ```bash # 1. 切换到无图形界面模式 sudo systemctl isolate multi-user.target # 2. 卸载所有NVIDIA模 sudo modprobe -r nvidia_drm nvidia_modeset nvidia_uvm nvidia # 3. 杀死残留进程 sudo lsof -n -w /dev/nvidia* | awk '{print $2}' | xargs sudo kill -9 # 4. 安装驱动 sudo sh NVIDIA-Linux-*.run # 或使用apt安装 # 5. 恢复图形界面 sudo systemctl start graphical.target ``` 3. **Nouveau 冲突问题**(如引用[3]) - **现象**:安装时 nouveau 驱动干扰 - **解决方案**: ```bash # 永久禁用nouveau echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo update-initramfs -u ``` #### 三、核心问题总结 | 问题类型 | 根本原因 | 关键解决步骤 | |------------------------|----------------------------------|--------------------------------| | 源码目录缺失 | `nvidia-dkms-*` 包未正确安装 | 重装 `nvidia-dkms-510` + 符号链接 | | 模版本不匹配 | 旧驱动未完全卸载 | `apt purge nvidia-*` + 清理目录 | | 模已被加载 | X Server/CUDA 进程占用 | 文本模式卸载模 + 杀进程 | | Nouveau 冲突 | 开源驱动未禁用 | 黑名单 + 更新 initramfs | #### 四、验证与调试 1. 检查模加载状态: ```bash lsmod | grep nvidia ``` 2. 查看内核日志: ```bash dmesg | grep -i nvidia ``` 3. 检查驱动版本一致性: ```bash cat /proc/driver/nvidia/version nvidia-smi --query-gpu=driver_version --format=csv ``` #### 五、典型错误处理流程 ```mermaid graph TD A[安装失败] --> B{错误类型} B -->|目录不存在| C[重装nvidia-dkms] B -->|模已加载| D[进入文本模式卸载模] B -->|版本不匹配| E[彻底卸载旧驱动] C --> F[创建符号链接] D --> G[杀死占用进程] E --> H[清理残留文件] F --> I[重新安装] G --> I H --> I I --> J[验证nvidia-smi] ``` ### 相关问题 1. 如何检查当前系统加载的 NVIDIA 内核模版本? 2. 升级内核后 NVIDIA 驱动失效应如何修复? 3. 如何安全卸载不同版本的 NVIDIA 驱动避免冲突? 4. X Server 占用 GPU 资源时如何强制卸载驱动模? 5. DKMS 在 Linux 显卡驱动管理中的作用是什么? [^1]: 模版本不一致会导致初始化失败 [^2]: 内核模占用问题的进程排查方法 [^3]: Nouveau 冲突的典型解决方案 [^4]: 系统服务状态切换对驱动安装的影响 [^5]: 官方错误信息的完整解读和处理建议
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值