我想从许多子目录中的文件中提取某些值。我有一个可以执行此操作的工作代码:
for i in */; do grep "free energy" "$i"filename | tail -1 | xargs -I{} echo "$i: {}" >> output.txt; done
该tail -1
命令为我提供了每个文件的最后一个输出(我想要的),并且 xargs 构造在文件夹名称前面加上了文件夹名称,这样我就知道哪一行属于哪个系统。输出.txt 如下所示:
Cr/: free energy TOTEN = -18.87487583 eV Hf/: free energy TOTEN = -18.76845679 eV N/: free energy TOTEN = -15.90748159 eV Nb/: free energy TOTEN = -20.38801759 eV Ti/: free energy TOTEN = -14.92233353 eV TiN/: free energy TOTEN = -78.73147048 eV
其中Cr
、Hf
、N
等TiN
是文件夹名称。我的问题是右侧的值未正确对齐,因为文件夹具有不同的字符长度。更改文件夹名称是不可能的,因此我希望 xargs 命令始终使用一定数量的空格(例如 10 个)——至少作为最小值——以便垂直对齐是正确的。结果应该是这样的:
Cr/ : free energy TOTEN = -18.87487583 eV Hf/ : free energy TOTEN = -18.76845679 eV N/ : free energy TOTEN = -15.90748159 eV Nb/ : free energy TOTEN = -20.38801759 eV Ti/ : free energy TOTEN = -14.92233353 eV TiN/: free energy TOTEN = -78.73147048 eV
或这个
Cr /: free energy TOTEN = -18.87487583 eV Hf /: free energy TOTEN = -18.76845679 eV N /: free energy TOTEN = -15.90748159 eV Nb /: free energy TOTEN = -20.38801759 eV Ti /: free energy TOTEN = -14.92233353 eV TiN/: free energy TOTEN = -78.73147048 eV
这样我就可以使用Alt
+轻松地一次性复制所有值Leftclick
。
答案1
printf
就是你想要的
xargs -I{} printf "%-10s: %s\n" "$i" "{}"
请注意,这将使用 /usr/bin/printf,而不是 shell 的内置 printf。