相关疑难解决方法(0)

为什么文本文件以换行符结尾?

我假设这里的每个人都熟悉所有文本文件应以换行符结尾的格言.多年来我一直都知道这个"规则",但我一直在想 - 为什么?

unix newline file text-files

1375
推荐指数
15
解决办法
21万
查看次数

循环遍历Bash中的文件内容

如何使用Bash迭代文本文件的每一行?

使用此脚本:

echo "Start!"
for p in (peptides.txt)
do
    echo "${p}"
done
Run Code Online (Sandbox Code Playgroud)

我在屏幕上看到这个输出:

Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
Run Code Online (Sandbox Code Playgroud)

(后来我想做一些$p比输出到屏幕更复杂的事情.)


环境变量SHELL是(来自env):

SHELL=/bin/bash
Run Code Online (Sandbox Code Playgroud)

/bin/bash --version 输出:

GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

cat /proc/version 输出:

Linux version 2.6.18.2-34-default (geeko@buildhost) (gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)) #1 SMP Mon Nov 27 11:46:27 UTC 2006
Run Code Online (Sandbox Code Playgroud)

文件peptides.txt包含:

RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK …
Run Code Online (Sandbox Code Playgroud)

unix linux io bash loops

1242
推荐指数
11
解决办法
145万
查看次数

如何比较Bash中的字符串

如何将变量与字符串进行比较(如果匹配则执行某些操作)?

string bash

897
推荐指数
9
解决办法
114万
查看次数

逐行读取文件时读取bash脚本中的最后一行文件

我正在编写一个脚本来从文件中读取命令并执行特定命令.我希望我的脚本适用于单个输入参数,或者当参数是包含有问题参数的文件名时.

我的代码除了一个问题外,它的代码无效,它忽略了文件的最后一行.所以,如果文件如下.

file.txt的

file1
file2
Run Code Online (Sandbox Code Playgroud)

下面发布的脚本仅运行file.txt的命令

for currentJob in "$@"
do
    if [[ "$currentJob" != *.* ]]  #single file input arg
    then
        echo $currentJob
        serverJobName="$( tr '[A-Z]' '[a-z]' <<< "$currentJob" )"  #Change to lowercase
                                                                   #run cURL job
        curl -o "$currentJob"PisaInterfaces.xml http://www.ebi.ac.uk/msd-srv/pisa/cgi-bin/interfaces.pisa?"$serverJobName"
    else  #file with list of pdbs
        echo "Reading "$currentJob
        while read line; do
            echo "-"$line
            serverJobName="$( tr '[A-Z]' '[a-z]' <<< "$line" )"
            curl -o "$line"PisaInterfaces.xml http://www.ebi.ac.uk/msd-srv/pisa/cgi-bin/interfaces.pisa?"$serverJobName"
        done < "$currentJob"
    fi
done
Run Code Online (Sandbox Code Playgroud)

当然,有一个显而易见的工作,在while循环后我重复循环内部的步骤以完成最后一个文件的命令,但这是不可取的,因为我在while循环中所做的任何更改都必须重复在while循环之外.我在网上搜索过,找不到有人问这个确切的问题.我确信它在那里,但我还没有找到它.

我得到的输出如下.

>testScript.sh file.txt
Reading file.txt
-file1
  % …
Run Code Online (Sandbox Code Playgroud)

bash

10
推荐指数
1
解决办法
1万
查看次数

将变量中的 shell glob 展开到数组中

在 bash 脚本中,我有一个包含 shell glob 表达式的变量,我想将其扩展为匹配文件名的数组(nullglob打开),例如

pat='dir/*.config'
files=($pat)
Run Code Online (Sandbox Code Playgroud)

即使对于$pat(eg, pat="dir/*.config dir/*.conf) 中的多个模式,这也很好用,但是,我不能在模式中使用转义字符。理想情况下,我希望能够做到

pat='"dir/*" dir/*.config "dir/file with spaces"'
Run Code Online (Sandbox Code Playgroud)

包含该文件,所有以和*结尾的文件。.configfile with spaces

是否有捷径可寻?(eval如果可能的话,没有。)

由于模式是从文件中读取的,因此我无法按照此答案(以及其他各个地方)中的建议将其直接放入数组表达式中。

编辑:

将事情放在上下文中:我想做的是逐行读取模板文件并处理所有行,例如#include pattern. 然后使用 shell glob 解析包含内容。由于该工具是通用的,因此我希望能够包含带有空格和奇怪字符(例如*)的文件。

“主”循环如下所示:

    template_include_pat='^#include (.*)$'
    while IFS='' read -r line || [[ -n "$line" ]]; do
        if printf '%s' "$line" | grep -qE "$template_include_pat"; then
            glob=$(printf '%s' "$line" | sed -nrE "s/$template_include_pat/\\1/p")
            cwd=$(pwd -P)
            cd "$targetdir" …
Run Code Online (Sandbox Code Playgroud)

bash glob

7
推荐指数
1
解决办法
2882
查看次数

逐行阅读并逐行打印匹配

我是shell脚本的新手,如果我能从下面的问题中得到一些帮助,那就太棒了.

我想逐行读取文本文件,并将该行中所有匹配的模式打印到新文本文件中的一行.

例如:

$ cat input.txt

SYSTEM ERROR: EU-1C0A  Report error -- SYSTEM ERROR: TM-0401 DEFAULT Test error
SYSTEM ERROR: MG-7688 DEFAULT error -- SYSTEM ERROR: DN-0A00 Error while getting object -- ERROR: DN-0A52 DEFAULT Error -- ERROR: MG-3218 error occured in HSSL
SYSTEM ERROR: DN-0A00 Error while getting object -- ERROR: DN-0A52 DEFAULT Error
SYSTEM ERROR: EU-1C0A  error Failed to fill in test report -- ERROR: MG-7688
Run Code Online (Sandbox Code Playgroud)

预期输出如下:

$ cat output.txt

EU-1C0A TM-0401
MG-7688 DN-0A00 DN-0A52 MG-3218
DN-0A00 DN-0A52 …
Run Code Online (Sandbox Code Playgroud)

linux bash shell grep text-processing

6
推荐指数
2
解决办法
1528
查看次数

如何在bash脚本中逐行读取文件?

我在网上搜索过这个问题,到目前为止我找到了两种方法:

   while read line; do
      commands
   done < "$filename"
Run Code Online (Sandbox Code Playgroud)

    for $line in $(cat $filename); do
       commands
    done
Run Code Online (Sandbox Code Playgroud)

如果线条有空格,这些都不起作用,例如,如果我们有这样的线条

  textextext text
Run Code Online (Sandbox Code Playgroud)

它不会打印 textextext text

  textextext
  text
Run Code Online (Sandbox Code Playgroud)

它将这些事情视为一条不同的路线,我怎样才能避免这种情况发生?

bash scripting file line

4
推荐指数
2
解决办法
6646
查看次数

字符串连接不适用于逗号字符

bash脚本上的字符串连接对逗号","字符不起作用.

A="Hello";
B=",World";
C=$A$B
echo $C;
Run Code Online (Sandbox Code Playgroud)

它将输出打印为

你好,世界

Bash版本是:

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Run Code Online (Sandbox Code Playgroud)

相同的代码似乎在这里工作

bash string-concatenation

2
推荐指数
1
解决办法
3453
查看次数

awk 不等于运算符

我不确定我做错了什么,但我的 awk 命令肯定犯了一些错误。

我有两个文件,fileA 包含名称

文件A

Abhi
Roma
GiGi
KaKa
Run Code Online (Sandbox Code Playgroud)

FileB 包含其他具有名称的数据

Abhi 23  Pk
DaDa 43  Gk
Roma 33  Kk
PkPk 22  Aa
Run Code Online (Sandbox Code Playgroud)

现在,我尝试打印 fileA 中不存在的所有名称的详细信息。

for i in `cat FileA` ; do cat FileB | awk '{ if ($1!='$i') print $0_}'>> Result; done
Run Code Online (Sandbox Code Playgroud)

我得到的是

Abhi    23  Pk
DaDa    43  Gk
Roma    33  Kk
PkPk    22  Aa
Abhi    23  Pk
DaDa    43  Gk
Roma    33  Kk
PkPk    22  Aa
Abhi    23  Pk
DaDa    43  Gk
Run Code Online (Sandbox Code Playgroud)

所需输出

DaDa 43  Gk …
Run Code Online (Sandbox Code Playgroud)

bash awk if-statement

1
推荐指数
1
解决办法
6万
查看次数

在bash中按日期时间格式排序

这是我的数据的一个例子

ip=1.2.3.4, setup_time=05:58:38.617 GMT Tue Mar 16 2021, foo=moshe, bar=haim
ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Mar 16 2021, foo=moshe2, bar=haim2
Run Code Online (Sandbox Code Playgroud)

我希望能够按setup_timebash 中的列进行排序。我知道我不能使用,sort因为 sort 只允许按字符串匹配排序,这不是一种格式,YYYY-MM-DD HH:mm:ss因此字符串排序是不可能的。

所以任何想法将不胜感激。

谢谢你

#更新

好的,为了更好地了解我要实现的目标,我创建了以下文件,名为1

ip=1.2.3.4, setup_time=06:58:38.617 GMT Tue Mar 16 2021, foo=moshe, bar=haim
ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Mar 17 2021, foo=moshe2, bar=haim2
ip=2.3.4.5, setup_time=06:50:30.260 GMT Tue Mar 18 2021, foo=moshe2, bar=haim2
Run Code Online (Sandbox Code Playgroud)

所以我执行了这个:

cat 1 | sed 's/, /!/g' | sort -t '!' -k2,2
Run Code Online (Sandbox Code Playgroud)

我在这里所做的被替换, !所以我可以在排序中使用分隔符,问题是排序是进行字符串排序而不是时间戳排序,所以输出是: …

sorting bash datetime

1
推荐指数
1
解决办法
55
查看次数

bash 脚本 - for 循环

假设我有一个 txt 文件,例如:

CGND_01234    CGND-HRA-00736
CGND_34563    CGND-HRA-00567
...
Run Code Online (Sandbox Code Playgroud)

如何在 bash 中为下面的行创建一个 for 循环来迭代文件中的每一行?

find ./${first_word_in_the_first_line} -name "${second_word_in_the_first_line}*.bam" -type f 
find ./${first_word_in_the_second_line} -name "${second_word_in_the_second_line}*.bam" -type f
...
Run Code Online (Sandbox Code Playgroud)

bash for-loop find

0
推荐指数
1
解决办法
44
查看次数