著名的 SED 命令,用于提取第一行并打印到另一个文件
sed -n '1 p' /p/raw.txt | cat >> /p/001.txt ;
Run Code Online (Sandbox Code Playgroud)
在 /p/001.txt 中给出一个输出,如
John Doe
Run Code Online (Sandbox Code Playgroud)
但是如何修改上面的这个命令来添加一些自由文本,并有,例如,像这样的输出
Name: John Doe
Run Code Online (Sandbox Code Playgroud)
感谢您尝试的任何提示。
您可以在单个命令中执行此操作(并且没有子 shell):
sed 's/^/Name: /;q' /p/raw.txt >> /p/001.txt
Run Code Online (Sandbox Code Playgroud)
这在第一行前面加上“名称:”前缀,打印它,然后退出,这样您就不会处理其他行。在 之前添加行号q以打印最多(并包括)该编号的所有行。输出/p/001.txt就像您的原始代码一样附加到后面。
如果你想要一系列的行:
sed -n '3,9{s/^/Name: /;p}9q' /p/raw.txt >> /p/001.txt
Run Code Online (Sandbox Code Playgroud)
这从第 3-9 行读取,执行替换,打印,然后在第 9 行后退出。
如果你想要特定的行,我推荐 awk:
awk 'NR==3 || NR==9 { print "Name: " $0 } NR>=9 { exit }' /p/raw.txt >> /p/001.txt
Run Code Online (Sandbox Code Playgroud)
这有两个子句。有人说记录数(行号)是 3 或 9,在这种情况下,我们打印前缀和行。另一个告诉我们在第 9 条记录后停止读取文件。
下面是另外两个命令,用于显示 awk 如何仅作用于第一行或给定范围:
awk '{ print "Name: " $0 } NR >= 1 { exit }' /p/raw.txt >> /p/001.txt
awk '3 <= NR { print "Name: " $0 } NR >= 9 { exit }' /p/raw.txt >> /p/001.txt
Run Code Online (Sandbox Code Playgroud)
看来您正在不断地从另一个文件构建一个文件。考虑:
tail -Fn0 /p/raw.txt |sed 's/^/Name: /' >> /p/001.txt
Run Code Online (Sandbox Code Playgroud)
这将持续运行,仅将新条目(在命令运行后添加)添加到 /p/001.txt
也许你有很多重复要解决?
awk 'NR != FNR { $0 = "Name: " $0 } !s[$0]++' \
/p/001.txt /p/raw.txt > /tmp/001.txt && mv /tmp/001.txt /p/001.txt
Run Code Online (Sandbox Code Playgroud)
这将以前保存的名称与任何新名称折叠在一起,仅打印一次名称(为零!s[$0]++时为真s[$0](其默认状态),但在评估后,它增加到一,使其在第二次出现时为假。当一个裸子句没有任何动作,该行被打印出来。)因为我们正在读取输出文件,所以我们需要一个临时输出。成功完成后,我们将其移动到目标输出文件的顶部。
| 归档时间: |
|
| 查看次数: |
907 次 |
| 最近记录: |