首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并两个变量并输出到文件时避免换行符

合并两个变量并输出到文件时避免换行符
EN

Stack Overflow用户
提问于 2015-02-13 20:35:59
回答 3查看 64关注 0票数 0

我正在尝试运行这样的sh脚本来收集有关Ip地址的地理信息。inputfile.txt只是一个包含ip地址的单列文件。

以下是我的输入文件的示例:

代码语言:javascript
复制
213.100.122.171
213.100.126.188
213.100.129.186
213.100.18.247
213.100.23.238
213.100.26.151

下面是我使用的代码:

代码语言:javascript
复制
#!/usr/bin/env bash
output=outputfile.csv
for  i in $( cat "inputfile.txt"); 
do echo -e "$i,"$( geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat $i | cut -d' ' -f6,8-9)"" >> $output;
done

当我运行这个文件时,结果如下所示

代码语言:javascript
复制
213.100.126.188
,LV, N/A, N/A,
213.100.129.186
,SE, N/A, N/A,
213.100.18.247
,LV, N/A, N/A,
213.100.23.238
,LV, N/A, N/A

我想让他们排在各自的队伍里,就像

代码语言:javascript
复制
213.100.126.188,LV, N/A, N/A,
213.100.129.186,SE, N/A, N/A,
213.100.18.247,LV, N/A, N/A,
213.100.23.238,LV, N/A, N/A,

我的脚本哪里错了?

EN

回答 3

Stack Overflow用户

发布于 2015-02-13 20:47:55

cat中使用for循环不是逐行处理文件的好方法。我建议将您的脚本更改为如下所示:

代码语言:javascript
复制
#!/bin/bash

output=outputfile.csv    
while read -r line; do
    echo -e "$line, $( geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat "$line" | cut -d' ' -f6,8-9)"
done < inputfile.txt > "$output"

这将截断输出文件,并将循环的所有输出写入其中。用双引号括起命令替换和参数扩展可防止命令输出中的字符扩展问题。

票数 1
EN

Stack Overflow用户

发布于 2015-02-13 20:45:56

它很可能是生成换行符应用程序geoiplookup。因此,您必须通过sed管道输出槽来删除它:

代码语言:javascript
复制
for  i in $( cat "inputfile.txt"); 
  do echo -e "$i,"$( geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat $i | \
  cut -d' ' -f6,8-9 | sed ':a;N;$!ba;s/\n/)"" >> $output;
done
票数 0
EN

Stack Overflow用户

发布于 2015-02-13 21:22:05

好了,我找到问题了。输入文件的第一行是空的,脚本不知何故决定按照我所描述的那样工作。当我删除那行空行时,一切都很正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28499766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档