在bash中迭代地在csv中打印现有文本下面的文本

时间:2018-06-17 17:29:23

标签: bash awk sed

我将字符串打印到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

3 个答案:

答案 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必须重新打开,寻找文件结尾,并在循环内重复关闭文件句柄。 (好吧,寻求是由操作系统完成的,但它仍然不是免费的。)