【问题标题】:Using awk to put a header in a text file使用 awk 将标题放入文本文件中
【发布时间】:2014-02-18 11:39:16
【问题描述】:

我有很多文本文件,需要根据每个文件上的数据在每个文件上放置一个标题。

这个 awk 命令完成了任务:

awk 'NR==1{first=$1}{sum+=$1;}END{last=$1;print NR,last,"L";}' my_text.file

但这会将其打印在屏幕上,我想将此输出放在每个文件的标题中,并使用相同的文件名保存修改。

这是我尝试过的:

for i in *.txt
do
echo Processing ${i}
cat awk 'NR==1{first=$1}{sum+=$1;}END{last=$1;print NR,last,"L";}' "${i}" ${i} > $$.tmp && mv $$.tmp "${i}"
done

所以我想我不能使用 cat 将它们作为标题,还是我做错了什么?

提前致谢

【问题讨论】:

  • 使用perl-i 标志可能更简单!
  • 尝试将第 4 行替换为:awk 'NR==1{first=$1}{sum+=$1;}END{last=$1;print NR,last,"L";}' < "${i}"(鞭打cat
  • @JM88 得到答案了吗?

标签: bash shell awk cat


【解决方案1】:

更新:

awk:

awk 'BEGIN{print "header"}1' test.txt

没有awk:

cat & echo:

cat <(echo "header") test.txt

(或)

使用tac:

tac test.txt | echo "header" >> test.txt | tac test.txt

【讨论】:

    【解决方案2】:

    我认为您要对循环执行的操作是:

    for i in *.txt
    do
        echo "Processing $i"
        awk 'NR==1{first=$1}{sum+=$1}END{last=$1;print NR,last,"L"}' "$i" > $$.tmp &&
        cat "$i" >> $$.tmp &&
        mv $$.tmp "$i"
    done
    

    但不清楚您真正想要做什么,因为您从不使用 firstsum 并在 END 部分设置 last 是一个坏主意,因为它不适用于所有 awk 并且有简单的替代方案。

    如果您用一些示例输入和预期输出更新您的问题,我们可以为您提供帮助。

    【讨论】:

    • 有没有办法避免生成所有这些临时文件?
    • 只生成了 1 个临时文件。使用上面的脚本,您可以简单地添加一个 close(FILENAME) 然后执行您的 prints > FILENAME 但该脚本没有任何意义,因此它不可能是您真正在做的事情。在不知道你真正在做什么的情况下,很难给你一个好的答案。较新版本的 GNU awk 具有 -i inplace 选项,这可能是您想要的,但可能有更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2017-09-19
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多