Bash脚本剪切和文件名未硬编码

时间:2019-03-22 01:35:59

标签: linux bash

我有一个名为names.txt的文件,如下所示:

foreach ($cards as $card) {
    $choices["{$card->brand} **** **** **** {$card->last4}"] = $card->id;
}

$form = $this->createFormBuilder()
    ->add('card', ChoiceType::class, ['choices' => $choices,'expanded' => true, 'multiple' => false])
    ->add('Submit', SubmitType::class)
    ->getForm()

我想使它最终像:

0,james,hard,fun,circle

1,caron,hard,agin,square

我想运行一个脚本,询问该文件,然后使用$ 1自变量对这些文件进行更改并剪切。

我知道这是一个棘手的问题,可能涉及很多代码,因此,我非常感谢你们的帮助。

注意:我的文件包含9999个输入,并且第一个输入为0,因此总共有10,000个输入。

2 个答案:

答案 0 :(得分:1)

这是一个完整的文件,它将按照您要求的方式修改文件并将其写入终端,特别是标准输出,这是被写入终端的“渠道”之一默认情况下。 (渠道不是一个技术术语)。

#!/bin/bash
awk -F, -vOFS=, '{print $0,"c" $1 }' "$1" | cut -d, -f2-

如果数据中包含空白行,我们可以通过在awk片段中添加一个检查来跳过它们。

#!/bin/bash
awk -F, -vOFS=, 'NF > 0 {print $0,"c" $1 }' "$1" | cut -d, -f2-

如果文件名为rotate.sh,而您的数据为whatever.csv,则可以按以下方式调用

bash rotate.sh whatever.csv

这会将修改后的文件打印到您的终端。如果要将其保存在某处,请编写此代码。

bash rotate.sh whatever.csv > /tmp/a.csv

不要写以下内容

bash rotate.sh whatever.csv > whatever.csv

上面的脚本无法修改正在读取的文件。

@lurker提供的示例sed脚本将在Linux上运行。如果直接在命令行中键入此内容,它将在适当位置修改文件。

 sed -i "s/^\([0-9]*\),\(.*\)$/\2,c\1/" whatever.csv

该命令的OS X等效版本是

 sed -i '' "s/^\([0-9]*\),\(.*\)$/\2,c\1/" whatever.csv

答案 1 :(得分:1)

这是一种使用剪切和粘贴的方法:

$ paste -d, <( cut -d, -f2- names.txt )   <( cut -d, -f1 names.txt | sed 's/^/c/' )
james,hard,fun,circle,c0
caron,hard,agin,square,c1

当然,您可以将$ names.txt替换为$ 1,将其转换为脚本,如下所示:

#!/bin/bash
paste -d, <( cut -d, -f2- $1 )   <( cut -d, -f1 $1 | sed 's/^/c/' )

或者如果您确实要提示用户:

#!/bin/bash
echo -n "Please specify a file to rearrange:"
read filename
paste -d, <( cut -d, -f2- $filename )   <( cut -d, -f1 $filename | sed 's/^/c/' )

如果要验证用户输入的文件是否有效:

#!/bin/bash
echo -n "Please specify a file to rearrange:"
read filename
if [ -r "$filename" ] ; then  # is the file readable?
    paste -d, <( cut -d, -f2- $filename )   <( cut -d, -f1 $filename | sed 's/^/c/' )
else
  echo "'$filename' is not readable." >&2  # let them know its bad via stderr
fi