【问题标题】:How to add a text in next column of CSV in bash script [duplicate]如何在 bash 脚本中的 CSV 的下一列中添加文本[重复]
【发布时间】:2020-09-01 13:58:45
【问题描述】:

我有 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

但它会打印组中每个文件的所有行。

知道如何归档我的结果吗?

【问题讨论】:

  • 如果您的实际文件与显示的示例相同,那么以下内容可能会对您有所帮助paste -d',' file.txt input.txt,然后告诉我们进展情况。

标签: bash loops sed while-loop paste


【解决方案1】:

如果你是喜欢写更多行而不是更少行的类型,你可以试试这个:

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 更快。
测试在同一系统上运行。

【讨论】:

  • 发帖者需要一个偏好,不仅是为了写更多的代码行,也是为了写更慢、效率低的代码。抱歉,这个解决方案是 -1,当所有人都可以看到明显好得多的解决方案时。
  • @mathguy 我的解决方案基于海报提供的代码。我知道它越来越慢,这就是为什么我讽刺地说。我什至提到了RavinderSingh13的解决方案。 Stackoverflow 的规则显然是只对问题使用 cmets,以便在答案部分提供解决方案。我的解决方案正在运行。降级意味着这是一个错误的解决方案。因此,请检查您的降级。
  • 投反对票并不意味着“错误”,而是意味着“没有帮助”。如果有人正在访问此线程以寻找解决问题的有用方法,他们应该选择其他解决方案。如果两种解决方案都只有赞成票(更糟糕的是:如果 OP 出于某种原因选择了 your 劣质解决方案作为“正确答案”),那么该线程的未来访问者将如何知道该选择什么?在我看来,您的回答“没有帮助”(没错!) - 所以投反对票。
  • @mathguy 看看我的编辑。我为你做了一些测量。
  • 对于小文件,两个测量值都是假的。做 1000 或 10000 次,或者使用更大的文件。这些数字都在合理的误差范围内,这可能会受到系统中发生的其他事情的影响 - 如果同时触发了 cron 作业,这可能会导致负载足以完全支配您的测量。
猜你喜欢
  • 2013-07-24
  • 2021-06-04
  • 2012-03-19
  • 1970-01-01
  • 2021-04-07
  • 2012-10-22
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
相关资源
最近更新 更多