You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AWK将变量中的单词打印到指定行或文件末尾?

方法一:使用 awk 实现(兼顾文件不足两行的情况)

你的原脚本里的 awk 命令是在文件最后新增一行,而不是追加到第二行末尾。我们可以修改 awk 的逻辑,实现如果文件有至少两行,就把名字追加到第二行末尾;如果文件不足两行,就追加到文件最后一行(空文件则直接写入):

#!/bin/bash

filename="/path/my_file.txt"

read -p "Insert name: " name

# 使用awk处理并替换原文件
awk -v new_name="$name" '
{
    # 处理每一行:如果是第二行,追加名字
    if (NR == 2) {
        print $0 " " new_name
    } else {
        print $0
    }
}
END {
    # 如果文件行数小于2,处理末尾追加
    if (NR < 2) {
        if (NR == 1) {
            # 文件只有一行,追加到该行末尾
            print $0 " " new_name
        } else {
            # 文件为空,直接写入名字
            print new_name
        }
    }
}' "$filename" > temp_file && mv temp_file "$filename"

echo 'Name added'

原理说明:

  • NR == 2 判断当前是第二行,将原内容和新名字拼接后打印
  • END 块处理文件行数不足2的情况:如果只有1行,就追加到该行;如果是空文件,直接写入名字
  • 最后通过临时文件替换原文件(因为awk无法直接修改原文件)

方法二:使用 sed + 行数判断实现

这种方法更直观,先判断文件的行数,再决定是修改第二行还是追加到文件末尾:

#!/bin/bash

filename="/path/my_file.txt"

read -p "Insert name: " name

# 获取文件行数
line_count=$(wc -l < "$filename")

if [ "$line_count" -ge 2 ]; then
    # 行数≥2,在第二行末尾追加名字
    sed -i "2s/$/ $name/" "$filename"
else
    # 行数<2,直接追加到文件末尾(自动处理空文件)
    echo -n " $name" >> "$filename"
    # 如果文件原本为空,echo会自动加换行;如果有一行,-n避免多换行
fi

echo 'Name added'

原理说明:

  • wc -l < "$filename" 获取文件的行数(避免文件名干扰计数)
  • sed -i "2s/$/ $name/" 表示在第二行的行尾($ 匹配行尾)替换为原内容加空格和名字,-i 直接修改原文件
  • 当文件不足两行时,用 echo -n 追加,避免在已有行后多添加一个空行

内容的提问来源于stack exchange,提问作者Michele Cozzolino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:02:26