在 csv 中的 du 输出后追加文本
Append text after du output in csv
到目前为止,这是我的代码:
sizeFolder(){
du -h --max-depth=1 --block-size=1M $TMP_DIR | sort -hr | awk '{print ,}'
}
这是我的输出:
----------------------------
Fr 6. Jul 10:37:16 CEST 2018
----------------------------
;
PV Size /PV Name
;
3775 /usr add (line 1 from textfile)
1805 /usr/share add (line 2 from textfile)
1382 /usr/lib add (line 3 from textfile)
384 /usr/src
176 /usr/bin
17 /usr/sbin
13 /usr/include
1 /usr/local
1 /usr/games
;
如何将简单文本文件中的文本行附加到路径名,如输出中所示?
您可以尝试类似的操作(使用 bash):
i=1
file="..." # replace the value by your file path
max="$(cat $file|wc -l)"
while read -r; do
if [[ $REPLY =~ ^[0-9]+ ]]; then
[[ $i -le $max ]] && echo "${REPLY} add $(head -n $i $file|tail -n 1)" || echo "${REPLY}"
(( i++ ))
else
echo "${REPLY}";
fi;
done < <(sizeFolder)
当然,还有很多其他解决方案(例如使用awk
)。
演示:
$ cat test.txt
----------------------------
Fr 6. Jul 10:37:16 CEST 2018
----------------------------
;
PV Size /PV Name
;
3775 /usr
1805 /usr/share
1382 /usr/lib
384 /usr/src
176 /usr/bin
17 /usr/sbin
13 /usr/include
1 /usr/local
1 /usr/games
;
$ cat test2.txt
line1
line2
line3
$ i=1; while read -r; do if [[ $REPLY =~ ^[0-9]+ ]]; then [[ $i -le $(cat test2.txt|wc -l) ]] && echo "${REPLY} add $(head -n $i test2.txt|tail -n 1)" || echo "${REPLY}"; (( i++ )); else echo "${REPLY}"; fi; done < test.txt
----------------------------
Fr 6. Jul 10:37:16 CEST 2018
----------------------------
;
PV Size /PV Name
;
3775 /usr add line1
1805 /usr/share add line2
1382 /usr/lib add line3
384 /usr/src
176 /usr/bin
17 /usr/sbin
13 /usr/include
1 /usr/local
1 /usr/games
;
$
script.sh
sizeFolder(){
# read simple text (given as argument )
IFS=$'\n' read -d '' -r -a simpletext < ""
# read output from du
IFS=$'\n' read -d '' -r -a duoutput < <(du -h --max-depth=1 --block-size=1M /TMP_DIR | sort -hr | awk '{print ,}')
len=${#simpletext[@]}
# loop over both variables
for ((i=0;i<=$len;i++))
do
echo "${duoutput[$i]} ${simpletext[$i]}"
done
}
sizeFolder ""
通话:
script.sh simpletext.txt
变化:
awk '{print ,}'
至:
awk 'NR==FNR{a[NR]=[=11=]; next} {print , , a[FNR]}' textfile -
使用paste
这可以非常简单:
paste -d' ' <(sizeFolder) test.txt
这不会处理示例输出中的 header,但由于您的代码不会生成它,所以我假设它将由不同的东西(例如周围的脚本)添加。只需确保此脚本在 paste
完成后仍执行此操作。
到目前为止,这是我的代码:
sizeFolder(){
du -h --max-depth=1 --block-size=1M $TMP_DIR | sort -hr | awk '{print ,}'
}
这是我的输出:
----------------------------
Fr 6. Jul 10:37:16 CEST 2018
----------------------------
;
PV Size /PV Name
;
3775 /usr add (line 1 from textfile)
1805 /usr/share add (line 2 from textfile)
1382 /usr/lib add (line 3 from textfile)
384 /usr/src
176 /usr/bin
17 /usr/sbin
13 /usr/include
1 /usr/local
1 /usr/games
;
如何将简单文本文件中的文本行附加到路径名,如输出中所示?
您可以尝试类似的操作(使用 bash):
i=1
file="..." # replace the value by your file path
max="$(cat $file|wc -l)"
while read -r; do
if [[ $REPLY =~ ^[0-9]+ ]]; then
[[ $i -le $max ]] && echo "${REPLY} add $(head -n $i $file|tail -n 1)" || echo "${REPLY}"
(( i++ ))
else
echo "${REPLY}";
fi;
done < <(sizeFolder)
当然,还有很多其他解决方案(例如使用awk
)。
演示:
$ cat test.txt
----------------------------
Fr 6. Jul 10:37:16 CEST 2018
----------------------------
;
PV Size /PV Name
;
3775 /usr
1805 /usr/share
1382 /usr/lib
384 /usr/src
176 /usr/bin
17 /usr/sbin
13 /usr/include
1 /usr/local
1 /usr/games
;
$ cat test2.txt
line1
line2
line3
$ i=1; while read -r; do if [[ $REPLY =~ ^[0-9]+ ]]; then [[ $i -le $(cat test2.txt|wc -l) ]] && echo "${REPLY} add $(head -n $i test2.txt|tail -n 1)" || echo "${REPLY}"; (( i++ )); else echo "${REPLY}"; fi; done < test.txt
----------------------------
Fr 6. Jul 10:37:16 CEST 2018
----------------------------
;
PV Size /PV Name
;
3775 /usr add line1
1805 /usr/share add line2
1382 /usr/lib add line3
384 /usr/src
176 /usr/bin
17 /usr/sbin
13 /usr/include
1 /usr/local
1 /usr/games
;
$
script.sh
sizeFolder(){
# read simple text (given as argument )
IFS=$'\n' read -d '' -r -a simpletext < ""
# read output from du
IFS=$'\n' read -d '' -r -a duoutput < <(du -h --max-depth=1 --block-size=1M /TMP_DIR | sort -hr | awk '{print ,}')
len=${#simpletext[@]}
# loop over both variables
for ((i=0;i<=$len;i++))
do
echo "${duoutput[$i]} ${simpletext[$i]}"
done
}
sizeFolder ""
通话:
script.sh simpletext.txt
变化:
awk '{print ,}'
至:
awk 'NR==FNR{a[NR]=[=11=]; next} {print , , a[FNR]}' textfile -
使用paste
这可以非常简单:
paste -d' ' <(sizeFolder) test.txt
这不会处理示例输出中的 header,但由于您的代码不会生成它,所以我假设它将由不同的东西(例如周围的脚本)添加。只需确保此脚本在 paste
完成后仍执行此操作。