【问题标题】:Bash Script : Edit .txt by LineBash 脚本:按行编辑 .txt
【发布时间】:2015-02-23 14:45:13
【问题描述】:

我有一个长度未知的文本文件。每行有两个值:

VALUE1[SPACE]VALUE2

现在我必须获取另一个(或相同)文件,其中包含一个新列表,例如:

0.0.0.0/rep/com/bla/blub/VALUE1/VALUE2/VALUE1-VALUE2.zip

...对于列表中包含两个值的每一行。我该怎么做?

【问题讨论】:

    标签: bash shell ubuntu scripting


    【解决方案1】:

    这是 awk 的一个很好的用例(已更新以处理括号):

    awk -F" " '{ gsub("\\(", "", $1); gsub("\\)", "", $2);print "0.0.0.0/rep/com/bla/blub/"$1"/"$2"/"$1"-"$2".zip"}' test.txt > yournewfile.txt
    

    这将用空格分隔每一行,替换第一个标记$1 中的左括号并替换第二个标记$2 中的右括号,然后在它们各自的标记$1$2 中使用值在您使用print输出的字符串中

    【讨论】:

    • 这是否仅适用于第一个值集?我需要逐行编辑,以便为每一行获取一个包含该行值的链接:/
    • 这将遍历输入文件中的每一行并在输出文件中创建一个新行。
    • 请取消删除your recent SQL answer。除了 OP 之外,它仍然可能对其他人有所帮助(请注意,它仅适用于 SQL Server 2012 及更高版本)。
    【解决方案2】:

    我假设VALUE1VALUE2 不包含空格,否则第一个定义会变得模棱两可。有了这个假设,您可以使用cut 在第一个空格处分割一行,并使用字符串插值组合filename 变量:

    cat txt-File | while read VALUE1 VALUE2 _; do
        filename="0.0.0.0/rep/com/bla/blub/$VALUE1/$VALUE2/$VALUE1-$VALUE2.zip"
    
        # Do something with filename...
        stat "$filename"
    done
    

    【讨论】:

    • while read VALUE1 VALUE2 _; do ... done <file 会避免烦人的外部流程,并且会更加地道。
    • uff,你可以把这个简化得很:cat file | while不是必须的,你可以说while ... done < file。此外,read 可以通过说 while read value1 value2 ... 来读取多个参数
    • 我更喜欢前面的cat file,因为它使循环正在处理的内容一目了然,而无需滚动到底部。修复了另一件事。
    • @StefanoSanfilippo:很遗憾,您不能像使用常规单个命令那样将<file 放在循环的前面。会更清楚。
    【解决方案3】:

    输入数据文件的格式是(VALUE1 VALUE2).。你先把开头的(去掉,后面的).去掉有很多方法,这里有一个

    sed 's/(//g' yourfile | sed 's/).//g' 
    

    然后您可以将其传递给awk。这里$1对应第一列,$2对应第二列:

    sed 's/(//g' yourfile | sed 's/).//g' | awk '{print "0.0.0.0/rep/com/bla/blub/"$1"/"$2"/"$1"-"$2".zip"}'
    

    【讨论】:

    • 我建议你自己试试看;-)
    【解决方案4】:

    我会为此使用sed

    sed $'s,^[ \t]*\([^ \t]*\)[ \t][ \t]*\([^ \t]*\).*$,0.0.0.0/rep/com/bla/blub/\1/\2/\1-\2.zip,' filename >new-filename
    

    如果您愿意,可以通过添加-i.baksed -i.bak $'s,...,' 来修改原始文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-29
      • 2023-01-08
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2012-01-10
      • 2010-12-05
      相关资源
      最近更新 更多