【问题标题】:Simple bash script - concatenating strings简单的 bash 脚本 - 连接字符串
【发布时间】:2012-12-19 23:10:06
【问题描述】:

我正在学习 bash 脚本,我编写了这个简单的脚本:

#!/bin/bash
for f in $(cat test.csv | cut -d';' -f 4)
do
EXT=".pdf"
echo "$f$EXT"
done

文件 test.csv 在哪里:

col1;col2;col3;test1
col1;col2;col3;test2
col1;col2;col3;test3
...

这个脚本的输出是:

.pdf
.pdf
.pdf
...

预期的输出是:

test1.pdf
test2.pdf
test3.pdf
...

很抱歉提出愚蠢的问题,但我认为这是一个小问题。

与此脚本相同的输出:

#!/bin/bash
while IFS=\; read col1 col2 col3 col4
do
echo "$col4".pdf
done < test.csv

【问题讨论】:

  • 它是你真正的 test.csv 吗?您正在提取以分号分隔的列中的第 4 列,但您的示例没有第 4 列。
  • 是的,test.csv感兴趣的内容是第4列。固定。
  • 如果 test.csv 确实有 4 列或更多,请编辑您的问题并显示真实示例(即使它们无趣,我们也可以看到 4 列)。
  • 刚刚尝试了你原来的 for 循环,它对我来说很好用。脚本中是否还有其他内容被您删掉了?或者,您确定输入文件test.csv 中没有控制字符吗?顺便说一句,你是如何运行脚本的?
  • 重要的是要注意该脚本仅适用于 echo "$col4" 而没有 .pdf 字符串。我通过 macosx 终端 ./script 运行它

标签: string macos bash loops for-loop


【解决方案1】:

不要做for i in $(cat something)。它会将整个文件保存在不需要的内存中。它也不适用于列中的空格。

更好地逐行解析,并使用 shell 工具拆分列(read 内置)。

类似的东西

while IFS=\; read col1 col2 col3 col4
do
    echo "$col4".pdf
done < test.csv

应该这样做。

如果您的列由空格分隔,您可以删除 IFS=\; 部分。

【讨论】:

  • 为了简化我创建了一个带有cat test.csv | cut -d';' -f 4 &gt;&gt; test 输出的文件测试并修改了脚本:while read f do echo "$f".pdf done &lt; test,实际上输出与我的脚本相同。一长串“.pdf”...
  • 尚未工作...始终是 .pdf .pdf .pdf 的列表。 ...这就像他失去了 $col4 的价值
  • @Kartone:是的,它有效。如果它不适合您,那么您可能使用的测试集与您提供给我们的测试集不同。
  • 我会尝试更改测试文件。
【解决方案2】:

或者使用 sed:

sed  's/.*;\(.*\)/\1.pdf/' file

【讨论】:

    【解决方案3】:

    试试这个:

    #!/bin/bash
    while read line
    do
            LINE=`echo "$line" | awk -F';' '{print $4}'`
            echo "${LINE}.pdf"
    done < test.csv
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 2016-05-07
      • 2015-06-02
      • 2015-12-30
      • 2015-12-18
      相关资源
      最近更新 更多