File.tsv 是一个有 7 列的制表符分隔文件:
cat File.tsv
1 A J 1
2 B K N 1
3 C L O P Q 1
Run Code Online (Sandbox Code Playgroud)
以下读取File.tsv7 列制表符分隔文件,并将条目存储在数组 A 中。
while IFS=$'\t' read -r -a D; do
A=("${A[@]}" "${D[i]}" "${D[$((i + 1))]}" "${D[$((i + 2))]}" "${D[$((i + 3))]}" "${D[$((i + 4))]}" "${D[$((i + 5))]}" "${D[$((i + 6))]}")
done < File.tsv
nA=${#A[@]}
Run Code Online (Sandbox Code Playgroud)
while IFS=$'\t' read -r -a D; do
A=("${A[@]}" "${D[i]}" "${D[$((i + 1))]}" "${D[$((i + 2))]}" "${D[$((i + 3))]}" "${D[$((i + 4))]}" …Run Code Online (Sandbox Code Playgroud) 这是一个简化的代码,如果它包含与父目录和.md扩展名相同的文件名,则打印目录的名称。
FIND(){
find . -type d -exec sh -c '
for d do
[ -f "${d}/${d##*/}.md" ] && printf "%s\n" "$d"
done' find-sh {} +
}
FIND
Run Code Online (Sandbox Code Playgroud)
概括地说,我想将搜索词${d}/${d##*/}.md作为参数发送给FIND函数,但不幸的是,这不会输出任何内容:
FIND(){
local SearchTerm="${1}"
find . -type d -exec sh -c '
for d do
[ -f "${SearchTerm}" ] && printf "%s\n" "$d"
done' find-sh {} +
}
FIND '${d}/${d##*/}.md'
Run Code Online (Sandbox Code Playgroud)
我确信SearchTerm. 任何提示?
我试过了:FIND '\${d}/\${d##*/}.md'但没有输出
cat A.tsv
1,a,d
2,b,e
3,c,f
Run Code Online (Sandbox Code Playgroud)
cat A.tsv
1,a,d
2,b,e
3,c,f
Run Code Online (Sandbox Code Playgroud)
$ awk -F ',' -v OFS="," '{print $2, $3}' A.tsv
a,d
b,e
c,f
Run Code Online (Sandbox Code Playgroud)
$ awk 'FS=","; OFS=","; {print $2, $3}' A.tsv
1,a,d
1,a,d
,
2,b,e
2,b,e
b,e
3,c,f
3,c,f
c,f
Run Code Online (Sandbox Code Playgroud)
$ awk -F ',' 'OFS=","; {print $2, $3}' A.tsv
1,a,d
a,d
2,b,e
b,e
3,c,f
c,f
Run Code Online (Sandbox Code Playgroud)
$ awk -v OFS="," 'FS=","; {print $2, $3}' A.tsv
1,a,d
,
2,b,e
b,e
3,c,f
c,f
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么最后 4 个命令的结果与第一个不同吗?
请参阅:shell 脚本中 awk …
我试图递归地查找文件夹中的所有目录,同时通过排除所有包含.git文件的路径来排除所有 git 子模块。我怎么能做到?
解释:
.git文件存在于每个子模块文件夹的根目录中。这个子模块文件夹可以包含在任何地方。
测试用例
$ mkdir Test
$ cd Test
$ mkdir a
$ mkdir b
$ mkdir c
$ cd a
$ mkdir .git
$ cd ..
$ cd b
$ touch .git
$ cd ..
$ cd c
$ mkdir c1
$ mkdir c2
$ cd..
$ find . -type d \( \( ! -name . -exec [ -e {}/.git ] \; -prune \) -o \( \( \
-name .git\
-o -name .vscode\ …Run Code Online (Sandbox Code Playgroud) a.1.58 fadado/CSV https://github.com/fadado/CSV
a.1.63 jehiah/json2csv https://github.com/jehiah/json2csv
a.1.80 stedolan/jq https://github.com/stedolan/jq/issues/370
Run Code Online (Sandbox Code Playgroud)
mapfile -d $'\t' -t Link < <(awk 'BEGIN{FS="\t"; OFS="\t"} {print $2,$3}' "${SessionP}" | fzf)
Run Code Online (Sandbox Code Playgroud)
在上面的命令中,我使用-t了 mapfile 选项,但echo "${Link[1]}"打印了一个新的行尾!
参考
column有封装形式util-linux和bsdmainutils。这两个软件包都安装在 Linux Mint 20.2 中
$ type column
column is /usr/bin/column
column is /bin/column
Run Code Online (Sandbox Code Playgroud)
这两个列都指向 bsd 列工具。我如何从 访问该工具util-linux?
以前 mktemp 用于在/tmp. 今天我注意到 mktemp 正在创建文件而 $PWD不是在/tmp?
笔记:
我能够做到:ls /tmp
$ mktemp --version
mktemp (GNU coreutils) 8.30
Run Code Online (Sandbox Code Playgroud)
$ echo $TMPDIR
$
Run Code Online (Sandbox Code Playgroud) 当我echo "${PATH}" | tr -s ':' '\n' | nl从 bash 脚本内部和终端输入时,得到相同的结果:
1 /home/nikhil/Documents/Git/Cs/Architecture/bin
2 /home/nikhil/.local/bin
3 /home/nikhil/opt/.nvm/versions/node/v16.13.0/bin
4 /home/nikhil/opt/bin
5 /usr/local/sbin
6 /usr/local/bin
7 /usr/sbin
8 /usr/bin
9 /sbin
10 /bin
11 /usr/games
12 /usr/local/games
13 /snap/bin
14 /home/linuxbrew/.linuxbrew/bin
15 /home/linuxbrew/.linuxbrew/sbin
16 /home/nikhil/.cargo/bin
17 /home/nikhil/.cabal/bin
18 /home/nikhil/opt/go/bin
19 /home/nikhil/.ruby/bin
20 /home/linuxbrew/.linuxbrew/opt/fzf/bin
Run Code Online (Sandbox Code Playgroud)
但是当我在 bash 脚本中和终端上输入以下内容时,我得到不同的结果:
# From Terminmal
$ type pandoc
pandoc is aliased to `/usr/bin/pandoc'
pandoc is /usr/bin/pandoc
pandoc is /home/linuxbrew/.linuxbrew/bin/pandoc
pandoc is /home/nikhil/.cabal/bin/pandoc
Run Code Online (Sandbox Code Playgroud)
# From Terminmal
$ …Run Code Online (Sandbox Code Playgroud) 我想删除[a-zA-Z] 字符串中第一个字母之前的所有字符。例如:
#121Abc-->Abc
%Ab#c-->Ab#c
Ab#c-->Ab#c
Abc-->Abc
1Abc-->Abc
1 21Abc-->Abc
1^1 Abc-->Abc
注意:所有非字母包括非打印字符。
用bash工具可以吗?
我试图删除第 3 行之后的所有空行,直到文件末尾:
cat ${File}
1
2
3
4
5
5
6
7
8
9
sed -e '3,${s~^$~~g}' ${File}
1
2
3
4
5
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)
观察:输出没有变化。
期望输出
1
2
3
4
5
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)
有几个问题可以解决问题,但我想尝试以下方法:
在这个问题中,我基本上将数组作为环境变量,然后尝试将字符串存储到单独的数组元素中。
a=('Apple Tomato' 'Banana Carrot') bash -c \
'b=($(echo "${a}")); echo -e "${b[0]}\n"; echo "${b[1]}";'
Run Code Online (Sandbox Code Playgroud)
(Apple
Tomato
Run Code Online (Sandbox Code Playgroud)
苹果番茄
香蕉胡萝卜
此外,如果原始数组在单引号数组元素内有双引号,是否会保留引号。例如:a=('Apple "Tomato"' 'Banana "Carrot"')