我将字符串打印到csv文件。有没有办法在bash中迭代地在csv文件中的pre-exisiting文本下面添加另一个字符串?
例如,假设我当前的csv文件看起来像这样
12, hello, english
13, hola, espanol
14, hat tip!, british
字符串的下一次迭代应该在上面的文本下方添加文本,使其看起来像下面等等。
12, hello, english
13, hola, espanol
14, hat tip!, british
15, namaste, hindi
16, hallo, german
答案 0 :(得分:1)
编辑: 在你有大量的字符串连接到你的Input_file的输出然后你可以在你的awk
命令中提及它们然后可以像()这样使用它,你不需要硬编码任何东西:
awk '
BEGIN{
FS=OFS=", ";
num=split("namaste, hindi;hallo, german",array,";")
}
1;
END{
val=$1;
for(i=1;i<=num;i++){
print ++val,array[i]}
}' Input_file
关注awk
可能会有所帮助。
awk -v line1="15, namaste, hindi" -v line2="16, hallo, german" '1; END{print line1 ORS line2}' Input_file
解决方案2:考虑到新行存在于新文件中,使用简单的cat
命令。所以它将是:
cat Input_file Input_file_with_new_lines
上面只会在控制台上打印它们,以防您想保存Input_file本身,然后在上面的代码中附加以下内容。
> temp_file && mv temp_file Input_file
答案 1 :(得分:1)
import time
def accurate_delay(delay):
''' Function to provide accurate time delay in millisecond
'''
_ = time.perf_counter() + delay/1000
while time.perf_counter() < _:
pass
delay = 10
t_start = time.perf_counter()
print('Wait for {:.0f} ms. Start: {:.5f}'.format(delay, t_start))
accurate_delay(delay)
t_end = time.perf_counter()
print('End time: {:.5f}. Delay is {:.5f} ms'.
format(t_end, 1000*(t_end - t_start)))
sum = 0
ntests = 1000
for _ in range(ntests):
t_start = time.perf_counter()
accurate_delay(delay)
t_end = time.perf_counter()
print('Test completed: {:.2f}%'.format(_/ntests * 100), end='\r', flush=True)
sum = sum + 1000*(t_end - t_start) - delay
print('Average difference in time delay is {:.5f} ms.'.format(sum/ntests))`
输出:
12, hello, english 13, hola, espanol 14, hat tip!, british 15, namaste, hindi 16, hallo, german
答案 2 :(得分:1)
bash重定向操作符>>
附加到输出文件的末尾。
printf '%i,%s,%s\n' \
15 "namaste" "hindi" \
16 "hallo" "german" >>file.csv
你的问题听起来很模糊,就像你想从某种循环中做到这一点。注意如何
while condition; do
something >>file
done
的效率明显低于
while condition; do
something
done >>file
因为在前一种情况下,shell必须重新打开,寻找文件结尾,并在循环内重复关闭文件句柄。 (好吧,寻求是由操作系统完成的,但它仍然不是免费的。)