如何用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
相关产品推荐
相关产品推荐

