如何在 bash 脚本中的 CSV 的下一列中添加文本
How to add a text in next column of CSV in bash script
我有 2 个文件
#cat file.txt
aaa
bbb
ccc
#cat input.txt
191
112
339
我需要
#cat output
aaa,191
bbb,112
ccc,339
我正在努力
while IFS= read -r line
do
cat file.txt | grep "\.$line$" | wc -l >> output.txt
sed -i "1 i\$line" output.txt
done < input.txt
但它会打印组中每个文件的所有行。
知道如何存档我的结果吗?
如果你是那种喜欢多写而不是少行的人,你可以试试这个:
echo -n "" > output.txt
while IFS= read -r line_input && IFS= read -r line_file <&3
do
echo "$line_input,$line_file" >> output.txt
done <input.txt 3<file.txt
如果没有,您可以简单地使用@RavinderSingh13 提示 ;-)
更新
有人评论说我提供的解决方案比解决方案慢
paste -d ',' file.txt input.txt
所以我测量了执行时间并得到以下值:
#!/bin/bash
START=$(date +%s.%N)
paste -d ',' file.txt input.txt > output.txt
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
echo "$DIFF";
我是最快的:
.004961322
| test 1 |.005088686 |
| test 2 |.005036140 |
| test 3 |.005019742 |
| test 4 |.004961322 |
| test 5 |.005030747 |
| test 6 |.004978428 |
接下来我检查了我提供的解决方案
#!/bin/bash
START=$(date +%s.%N)
echo -n "" > output.txt
while IFS= read -r line_input && IFS= read -r line_file <&3
do
echo "$line_input,$line_file" >> output.txt
done <input.txt 3<file.txt
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
echo "$DIFF";
我得到了
.002386748
| test 1 |.003516318 |
| test 2 |.003538960 |
| test 3 |.002386748 |
| test 4 |.002584314 |
| test 5 |.003461923 |
| test 6 |.003619142 |
所以我的解决方案稍微长了一点,但比使用 paste
更快。
测试是在同一系统上 运行。
我有 2 个文件
#cat file.txt
aaa
bbb
ccc
#cat input.txt
191
112
339
我需要
#cat output
aaa,191
bbb,112
ccc,339
我正在努力
while IFS= read -r line
do
cat file.txt | grep "\.$line$" | wc -l >> output.txt
sed -i "1 i\$line" output.txt
done < input.txt
但它会打印组中每个文件的所有行。
知道如何存档我的结果吗?
如果你是那种喜欢多写而不是少行的人,你可以试试这个:
echo -n "" > output.txt
while IFS= read -r line_input && IFS= read -r line_file <&3
do
echo "$line_input,$line_file" >> output.txt
done <input.txt 3<file.txt
如果没有,您可以简单地使用@RavinderSingh13 提示 ;-)
更新
有人评论说我提供的解决方案比解决方案慢
paste -d ',' file.txt input.txt
所以我测量了执行时间并得到以下值:
#!/bin/bash
START=$(date +%s.%N)
paste -d ',' file.txt input.txt > output.txt
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
echo "$DIFF";
我是最快的:
.004961322
| test 1 |.005088686 |
| test 2 |.005036140 |
| test 3 |.005019742 |
| test 4 |.004961322 |
| test 5 |.005030747 |
| test 6 |.004978428 |
接下来我检查了我提供的解决方案
#!/bin/bash
START=$(date +%s.%N)
echo -n "" > output.txt
while IFS= read -r line_input && IFS= read -r line_file <&3
do
echo "$line_input,$line_file" >> output.txt
done <input.txt 3<file.txt
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
echo "$DIFF";
我得到了
.002386748
| test 1 |.003516318 |
| test 2 |.003538960 |
| test 3 |.002386748 |
| test 4 |.002584314 |
| test 5 |.003461923 |
| test 6 |.003619142 |
所以我的解决方案稍微长了一点,但比使用 paste
更快。
测试是在同一系统上 运行。